ViewModel personnalisée avec MVC 2 HTML Helpers fortement typées retour objet null sur Créer?

StackOverflow https://stackoverflow.com/questions/2494940

Question

J'ai un trouble en essayant de créer une entité avec une vue personnalisée modelée créer la forme. Voici mon modèle de vue personnalisée pour la catégorie sous forme de création.

public class CategoryFormViewModel
{
    public CategoryFormViewModel(Category category, string actionTitle)
    {
        Category = category;
        ActionTitle = actionTitle;
    }

    public Category Category { get; private set; }
    public string ActionTitle { get; private set; }
}

et ceci est mon contrôle utilisateur lorsque l'interface utilisateur est

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<CategoryFormViewModel>" %>

        <h2>
            <span><%= Html.Encode(Model.ActionTitle) %></span>
        </h2>
        <%=Html.ValidationSummary() %>
        <% using (Html.BeginForm()) {%>
        <p>
            <span class="bold block">Başlık:</span>
            <%=Html.TextBoxFor(model => Model.Category.Title, new { @class = "width80 txt-base" })%>
        </p>
        <p>
            <span class="bold block">Sıra Numarası:</span>
            <%=Html.TextBoxFor(model => Model.Category.OrderNo, new { @class = "width10 txt-base" })%>
        </p>        
        <p>
            <input type="submit" class="btn-admin cursorPointer" value="Save" />
        </p>
        <% } %>

Lorsque je clique sur le bouton Enregistrer, il ne marche pas lier la catégorie pour moi parce que je suis de l'aide du modèle de vue personnalisée et fortement typé aides html comme ça

<%=Html.TextBoxFor(model => Model.Category.OrderNo) %>

Ma source HTML ressemble à ceci

<form action="/Admin/Categories/Create" method="post">
        <p>
            <span class="bold block">Başlık:</span>
            <input class="width80 txt-base" id="Category_Title" name="Category.Title" type="text" value="" />
        </p>
        <p>
            <span class="bold block">Sıra Numarası:</span>
            <input class="width10 txt-base" id="Category_OrderNo" name="Category.OrderNo" type="text" value="" />
        </p>        
        <p>
            <input type="submit" class="btn-admin cursorPointer" value="Kaydet" />
        </p>
        </form>

Comment puis-je résoudre ce problème?

Était-ce utile?

La solution

Votre Voir modèle a besoin d'un constructeur par défaut sans paramètres et vous avez besoin de méthodes publiques pour fixer chacune des propriétés. Le modèle de liaison par défaut utilise les setters publics pour remplir l'objet.


Le modèle de liaison par défaut a des règles qu'il suit. Il choisit les données à lier dans l'ordre suivant:

  1. Paramètres de formulaire à partir d'un poste
  2. données d'itinéraire Url définies par vos définitions d'itinéraire dans Global.asax.cs
  3. Paramètres de chaîne de requête

Le modèle de liaison par défaut utilise ensuite plusieurs stratégies pour se lier à des modèles / paramètres dans vos méthodes d'action:

  1. Le nom exact correspond à
  2. Matchs avec prefix.name où préfixe est la classe parente et son nom est la sous-classe / propriété
  3. nom sans préfixe (tant qu'il n'y a pas de collision, vous n'avez pas à vous soucier de fournir le préfixe)

Vous pouvez remplacer le comportement avec plusieurs options de l'attribut Bind. Ceux-ci comprennent:

  • [Bind (prefix = "someprefix")] -. Force une carte à une classe parent spécifique identifiée par le préfixe
  • [Bind (Inclure = "val1, val2")] - Liste blanche des noms de se lier à
  • [Bind (exclude = "val1, val2")] - noms à exclure du comportement par défaut

Autres conseils

Vous pouvez utiliser des modèles de l'éditeur. Mettez votre contrôle ascx dans ~/Views/Shared/EditorTemplates/SomeControl.ascx. Ensuite, dans votre principale Voir (page ASPX) inclure le modèle comme si (en supposant que votre opinion est fortement typée à CategoryFormViewModel):

<%= Html.EditorForModel("SomeControl") %>

au lieu de

<% Html.RenderPartial("SomeControl", Model) %>

Faire un constructeur par défaut pour votre viewmodel et initialiser la catégorie il y a

public CategoryFormViewModel() 
{ 
    Category = new Category()
}

Et à votre action de contrôleur recevoir le viewmodel

public ActionResult ActionName(CategoryFormViewModel model)
{
    //here you can access model.Category.Title
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top