2017-02-26 1 views
0

Voici mon ViewModel complexeModèle ASP.NET MVC liaison dans le complexe viewmodel objet

public class OperationStudyInputViewModel 
{ 
    public OperationStudy OperationStudy { get; set; } 
    public FileUpload FileUploads { get; set; } 
    public IEnumerable<string> Attachments { get; set; } 
    public IEnumerable<string> Folders { get; set; } 
} 

Voici le modèle OperationStudy

public class OperationStudy 
{ 
    public int OperationStudyId { get; set; } 
    public string SpCategoryId { get; set; } 
    //Here is some Other Properties 
} 

Voici la OperationStudyInput() méthode Post

[HttpPost] 

public ActionResult OperationStudyInput([Bind(Exclude = "SpCategoryId")] OperationStudyInputViewModel inputViewModel, IEnumerable<HttpPostedFileBase> multiplefiles) 
{ 
    // some Necessary codes Here 
    _dbContext.OperationStudies.Add(inputViewModel.OperationStudy); 
    _dbContext.SaveChanges(); 
} 

Je veux exclure SpCategoryId De OperationStudy dans inputViewModel (inputViewModel.OperationStudy) dans OperationStudyInput() post mehtod. J'ai essayé avec le code précédent mais il ne fonctionne pas comme prévu !!

Toute aide s'il vous plaît !!

+1

Un modèle de vue ne doit pas contenir de modèle de données. Créez un modèle de vue pour 'OperationStudy' et omettez la propriété' OperationStudyId'. (et lorsque vous utilisez un modèle de vue, vous n'avez jamais besoin d'un attribut [Bind] '- c'est l'une des nombreuses raisons pour lesquelles vous utilisez un modèle de vue –

+0

Oui, je peux le faire, mais est-ce possible? – TanvirArjel

+1

Oui, mais sa pratique terrible, alors ne le considère pas - '[Bind (Exclude =" OperationStudy.SpCategoryId ")]' –

Répondre

1

Je recommanderais de faire la distinction entre les modèles de vue et les modèles de données que vous avez. Si vous revenez directement, cela peut entraîner des problèmes de sécurité inattendus (l'ajout soudain d'un champ dans le backend entraînera l'exposition de ce champ au web). Donc, ce que je ferais est de créer un certain nombre de modèles Web, que vous pouvez suffixer avec Web, par exemple. et faites une cartographie chaque fois que vous avez besoin de le retourner.

Cela permettra une bonne séparation entre votre vue et les couches BI. Pour vous aider à atteindre cet objectif, vous pouvez utiliser des frameworks tels que AutoMapper. Ce n'est pas nécessaire, mais vous aide avec la cartographie crud.

Vous pourriez penser que c'est une exagération, mais croyez-moi, vous verrez les avantages de cette approche à long terme. Vous pouvez également rechercher plus sur google sur le sujet de la séparation.

P.S. Je ne suggérerais aucun hacks avec enlever les données du modèle comme suggéré dans d'autres poteaux. Cela semble être une approche très fragile pour moi.

0

Vous pouvez spécifier l'attribut Bind sur la classe comme ceci:

[Bind(Exclude = "SpCategoryId")] 
public class OperationStudy 
{ 
    public int OperationStudyId { get; set; } 
    public string SpCategoryId { get; set; } 
} 

Mais, je vous recommande de créer et d'utiliser ViewModel séparés pour la liaison.