MVC 2表单值未发布

时间:2010-10-07 19:35:37

标签: c# asp.net-mvc-2

嘿所有人    我试图通过MVC音乐商店学习MVC 2和ASP等。与此同时,我试图将其正在做的事情与我正在开发的解决方案相符合。整体结构是IT帮助台票务系统,我正在开发创建,编辑和删除票证的非常广泛的管理功能。我已经非常仔细地阅读了本教程,但是当尝试使用应该发布到控制器方法的值时,它们已经碰到了一堵砖墙,并且它们没有到达那里。

对于创建部分,我的create.aspx看起来像

<h2>Create</h2>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
    <%: Html.ValidationSummary(true) %>

    <fieldset>
        <legend>Create New Request</legend>
        <%: Html.EditorFor(model => model.request,
               new {Softwares = Model.SoftwareName, Systems = Model.SystemIDNo}) %>

        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>

<% } %>

<div>
    <%: Html.ActionLink("Back to List", "Index") %>
</div>

部分视图,其调用是workRequest.ascx

<p> 
    <%= Html.LabelFor(model => model.Medium)%> 
    <%= Html.TextBoxFor(model => model.Medium)%>
    <%= Html.ValidationMessageFor(model => model.Medium)%> 
</p> 
<p> 
    <%= Html.LabelFor(model => model.Summary)%> 
    <%= Html.TextBoxFor(model => model.Summary)%> 
    <%= Html.ValidationMessageFor(model => model.Summary)%> 
</p> 
<p> 
    <%= Html.LabelFor(model => model.Details)%> 
    <%= Html.TextAreaFor(model => model.Details)%> 
    <%= Html.ValidationMessageFor(model => model.Details)%> 
</p>
<p> 
    <%= Html.LabelFor(model => model.WorkHalted)%> 
    <%= Html.TextBoxFor(model => model.WorkHalted)%>  
    <%= Html.ValidationMessageFor(model => model.WorkHalted)%> 
</p>
<p> 
    <%= Html.LabelFor(model => model.Frequency)%> 
    <%= Html.TextBoxFor(model => model.Frequency)%>
    <%= Html.ValidationMessageFor(model => model.Frequency)%> 
</p>
<p> 
    <%= Html.LabelFor(model => model.StartDate)%> 
    <%= Html.TextBoxFor(model => model.StartDate, String.Format("{0:g}", Model.StartDate))%> 
    <%= Html.ValidationMessageFor(model => model.StartDate)%> 
</p>
<p>
    <%= Html.LabelFor(model => model.SoftwareID) %>
    <%= Html.DropDownList("SoftwareID", new SelectList(ViewData["Softwares"] as IEnumerable, Model.SoftwareID)) %>
</p>
<p>
    <%= Html.LabelFor(model => model.SystemID) %>
    <%= Html.DropDownList("SystemID", new SelectList(ViewData["Systems"] as IEnumerable, Model.SystemID)) %>
</p>

和post创建控制器看起来像

[HttpPost]
    public ActionResult Create(WorkRequest newRequest)
    {
        try
        {
            storeDB.AddToWorkRequests(newRequest);
            storeDB.SaveChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }

    }

我在try中设置了一个断点并检查了进入newRequest的值,newRequest中的所有内容都为null,就像没有任何东西被传递一样。

在编辑方面也会发生类似的情况,根本没有任何东西从局部视图发送到控制器。

无论如何我确信它的东西相当简单,我是MVC,ASP,C#的新手,几乎所有这些。我通常不会问其他人太多,但我已经看了很长一段时间这个问题了,可以用一些新鲜的眼睛来看看这个问题。

提前致谢!

2 个答案:

答案 0 :(得分:0)

尝试使用与用于渲染视图的参数相同的视图模型类型以及强类型化的参数:

[HttpPost]
public ActionResult Create(ViewModelUsedToStronglyTypeTheView model)
{
    //model.request should be properly bound here
    try
    {
        storeDB.AddToWorkRequests(model.request);
        storeDB.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View(model);
    }
}

或使用前缀:

[HttpPost]
public ActionResult Create([Bind(Prefix = "request")] WorkRequest newRequest)
{
    //model.request should be properly bound here
    try
    {
        storeDB.AddToWorkRequests(newRequest);
        storeDB.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

答案 1 :(得分:0)

我相信你只需要将你的行动签名改为这样......

public ActionResult Create(WorkRequest request)

原因是发布的值的名称。它们看起来像RequestViewModel.Request.Summary,因此请求对象的名称实际上是Request。 <{1}}对象上没有Request属性,因此没有任何绑定。

您可以绑定到视图所绑定的对象WorkRequest,正如Darin Dimitrov所建议的那样。

或者,您可以按预期绑定到请求,只需要确保MVC知道如何绑定值。它只通过命名约定知道这些事情,所以如果你绑定一个子对象,你需要确保你的动作参数的名称与它的父对象的属性相同。