视图模型数据发送到控制器后丢失

本文关键字:控制器 模型 数据 视图 | 更新日期: 2023-09-27 17:51:07

这是我的视图模型:

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
}

And my view:

@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被正确加载。但是当我提交表单时,我的视图模型只包含VendorIdSpreadsheetFile,并且Vendorsnull

我需要做一些工作与Vendors收集后,我提交的形式,我不想加载所有的数据两次。

我如何保持数据在我的视图模型?

视图模型数据发送到控制器后丢失

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

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

提交表单后,我们可以获得HTML控件的值使用他们的name属性和您的下拉列表在获得HTML中呈现如下:

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

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

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