查看发布到控制器后丢失的模型数据

时间:2013-01-10 04:17:09

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

这是我的观点模型:

public class AgencyViewModel
{
    public int VendorId { get; set; }

    public IEnumerable<Vendor> Vendors { get; set; }

    public HttpPostedFileBase SpreadsheetFile { get; set; }
}

以下是我的两种控制器方法:

public ActionResult Upload()
{
    var viewModel = new AgencyViewModel
    {
        Vendors = _vendorsRepository.Vendors.OrderBy(v => v.Name)
    };

    return View(viewModel);
}


[HttpPost]
public ActionResult Upload(AgencyViewModel viewModel)
{
    // do stuff
}

我的观点:

@model MyModels.AgencyViewModel

@using (Html.BeginForm("Upload", "Agencies", FormMethod.Post,
    new { enctype = "multipart/form-data" }))
{
    @Html.DropDownListFor(model => model.VendorId,
        new SelectList(Model.Vendors, "VendorID", "Name"),
        "- Select a Vendor -")

    @Html.TextBoxFor(model => model.SpreadsheetFile, new { type = "file" })

    <p>
        <input type="submit" value="Next" />
    </p>
}

当我导航到Upload时,Vendors已正确加载。但是,当我提交表单时,我的视图模型只包含VendorIdSpreadsheetFileVendorsnull

我提交表单后需要对Vendors集合进行一些工作,而且我不想加载所有数据两次。

如何将数据保存在视图模型中?

2 个答案:

答案 0 :(得分:2)

你必须再次设置你的ViewData,你可以使用ActionFilter,如果你想保持DRY,另一个选择是覆盖控制器OnActionExecuted方法并在那里加载你的数据。

如果您正在充分利用MVC模式,则只需在验证失败时加载viewdata,因为在这种情况下,您将再次加载相同的视图。

答案 1 :(得分:0)

提交表单后,我们只能使用 name 属性获取HTML控件的值,并使用你的下拉列表在html中获取渲染,如下所示:

<select name="VendorId" id="VendorId"><option value="1">XYZ</option>

这就是为什么你能够获得VendorId的值而不是Model.Vendors的值,因为没有使用名称Vendors创建控件。

您可以将此列表存储在会话中,也可以再次调用数据库过程以在表单提交后获取列表。