Personalizado ViewModel con MVC 2 inflexible de los Ayudantes HTML devolver null objeto de Crear?

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

Pregunta

Estoy teniendo problemas al intentar crear una entidad con una vista personalizada modelado formulario de creación.A continuación es de mi costumbre de vista de modelo para la Categoría de Creación de la forma.

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; }
}

y este es mi control de usuario en la interfaz de usuario es

<%@ 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>
        <% } %>

Cuando hago clic en el botón guardar, no obligar a la categoría de mí porque yo soy el uso personalizado de la vista de modelo y de inflexible html helpers como que

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

Mi fuente html se parece a esto

<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>

¿Cómo puedo solucionar este problema?

¿Fue útil?

Solución

Su Modelo de Vista de las necesidades de un constructor sin parámetros y necesidad pública conjunto de métodos para cada una de las propiedades.El modelo predeterminado cuaderno utiliza el público incubadoras para rellenar el objeto.


El valor predeterminado cuaderno de modelo tiene algunas reglas que sigue.Elige qué datos se unen en el siguiente orden:

  1. Formulario de parámetros de un post
  2. Url de la ruta de datos definido por su ruta definiciones en el mundial.asax.cs
  3. Parámetros de cadena de consulta

El modelo predeterminado de cuaderno, a continuación, utiliza varias estrategias para vincular a los modelos, parámetros en sus métodos de acción:

  1. Exacto coincide con el nombre de
  2. Coincide con prefijo.el nombre de prefijo es la clase principal y el nombre de la subclase de la propiedad
  3. Nombre sin prefijo (siempre y cuando no hay colisiones usted no tiene que preocuparse de proporcionar el prefijo)

Puede reemplazar el comportamiento con varias opciones desde el enlace de atributo.Estos incluyen:

  • [Bind(Prefix = "someprefix")] -- Las fuerzas de un mapa a una determinada clase de padre identificados por el prefijo.
  • [Bind(Include = "val1, val2")] -- La lista blanca de nombres que se unen a
  • [Bind(Exclude = "val1, val2")] -- Los nombres de excluir de comportamiento predeterminado

Otros consejos

Se podría usar editor de plantillas. Ponga el mando a ascx en ~/Views/Shared/EditorTemplates/SomeControl.ascx. A continuación, dentro de su principal Vista (aspx) incluyen un template como (asumiendo que su visión es fuertemente tipado a CategoryFormViewModel):

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

en lugar de

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

Hacer un constructor predeterminado para su viewmodel y inicializar la Categoría de

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

Y en su acción de controlador recibir el viewmodel

public ActionResult ActionName(CategoryFormViewModel model)
{
    //here you can access model.Category.Title
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top