0

这是我的视图模型:

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已正确加载。但是当我提交表单时,我的视图模型只包含VendorIdandSpreadsheetFileVendorsis null

提交表单后,我需要对集​​合进行一些处理Vendors,并且我不想将所有数据加载两次。

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

4

2 回答 2

2

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

如果你很好地使用了 MVC 模式,你应该只需要在验证失败时加载视图数据,因为在这种情况下你会再次加载相同的视图。

于 2013-01-10T04:22:00.373 回答
0

提交表单后,我们可以仅使用其name属性获取 HTML 控件的值,并且您的下拉列表在 html 中呈现如下:

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

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

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

于 2013-01-10T10:16:37.440 回答