开发者

Data is empty in Post method asp.net mvc 2

I`m trying to display classes that have properties of type some custom class inside it. Model:

public class ComplexParent
{
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
} 
public class SimpleChild
{
    public int Id { get; set; }
    public string ChildName { get; set; }
    public string ChildDescription { get; set; }
}

Controller:

public ActionResult Testify(int id)
    {
        ComplexParent par = new ComplexParent();
        par.First = new SimpleChild() { Id = id };
        par.Second = new SimpleChild()
        {
            Id = id + 1,
            ChildName = "Bob",
            ChildDescription = "Second"
        };

      开发者_Go百科  return View("Testify", par);
    }

    [HttpPost]
    public ActionResult Testify(ComplexParent pComplexParent)
    {

        return View("Testify", pComplexParent);
    }

View:

<% using (Html.BeginForm())
   {%>
<fieldset>
    <legend>Fields</legend>
    <%: Html.EditorFor(x => x.First) %>
    <br />
    <%: Html.EditorFor(x => x.Second.ChildName)%>
    <br/>
    <br/>
    <br/>
    <% Html.RenderPartial("SimpleChild", Model.First); %>
    <p>
        <input type="submit" value="Watch me :-)" />
    </p>
</fieldset>
<% } %>

When it comes to Get it works just fine, I can see all the data. But on post pComplexParent parameter is empty (both properties of a complex class are nulls). Probably Im missing something here, but could not get this to work ... Small addition: view part that only shows editor for name makes Second child not null and name is set to Bob. But I dont understand how to make it just with EditorFor or DisplayFor methods.

UPDATE: Thanks to Darin Dimitrov, who kindly went throught all my code and found what caused this problem. The exact problem was that if you are using display template, asp.net mvc 2 doesnt post any values back and if whole template is has nothing to post back object is null. I still thinking of the way how to get the data, even if you don`t want to edit it. But using editor template does the thing and I have all objects filled with proper data now.


Your view is a bit of a mess. You are using editor templates along with partials for the first child. It is not very clear what fields are included inside the form. I would recommend you using only editor templates:

Model:

public class ComplexParent
{
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
}
public class SimpleChild
{
    public int Id { get; set; }
    public string ChildName { get; set; }
    public string ChildDescription { get; set; }
}

Controller:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Testify(int id)
    {
        var par = new ComplexParent();
        par.First = new SimpleChild() { Id = id };
        par.Second = new SimpleChild()
        {
            Id = id + 1,
            ChildName = "Bob",
            ChildDescription = "Second"
        };

        return View(par);
    }

    [HttpPost]
    public ActionResult Testify(ComplexParent pComplexParent)
    {
        return View(pComplexParent);
    }
}

View:

<% using (Html.BeginForm()) { %>
    <%: Html.EditorFor(x => x.First) %>
    <%: Html.EditorFor(x => x.Second) %>
    <input type="submit" value="Watch me :-)" />
<% } %>

Editor template for SimpleChild (~/Views/Home/EditorTemplates/SimpleChild.ascx):

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

<%: Html.HiddenFor(x => x.Id) %>
<%: Html.EditorFor(x => x.ChildName) %>
<%: Html.EditorFor(x => x.ChildDescription) %>

Now if you want to have different editor templates for the two child properties you could either specify the editor template name when including it:

<%: Html.EditorFor(x => x.First, "FirstChildEditor") %>

which corresponds to ~/Views/Home/EditorTemplates/FirstChildEditor.ascx or use an [UIHint] attribute at your model:

public class ComplexParent
{
    [UIHint("FirstChildEditor")]
    public SimpleChild First { get; set; }
    public SimpleChild Second { get; set; }
}

My recommendation is not to use Html.RenderPartial for generating input fields because their names will be hardcoded and won't bind properly depending on your objects hierarchy.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜