设置enctype =“multipart / form-data”会导致所有ViewBags值丢失

时间:2014-03-04 17:40:39

标签: asp.net-mvc forms model-view-controller multipartform-data

这是我的包含上传文件控件的View。所以它需要“multipart / form-data”内容类型。

@using (Html.BeginForm("Create", "RoutinTest", FormMethod.Post,
new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()

<div>
            @Html.LabelFor(model => model.ScannedFile)
            <div>
                <input type="file" name="ScannedFile"  multiple="multiple" />
                @Html.ValidationMessageFor(model => model.ScannedFile)
            </div>
</div>
<div>
            <div>
                <input type="submit" value="Save"  />
            </div>
 </div>   

这是我的控制器,它是创建动作方法:

[HttpGet]
 public ActionResult Create(string patientId, string fullName)
        {
            ViewBag.PatientId = patientId;
            ViewBag.FullName = fullName;
            return View();
        }

[HttpPost]
public ActionResult Create() RoutinTest routintest, string patientId, string fullName)
{

}

问题是,在第二个创建操作方法(post方法)上,patientId和fullName都会丢失。 (patientId = 0和fullName = null)但我在Get方法上设置了它们。

令人惊讶的是,当我将表单内容类型更改为默认值(通过删除multipart / form-data)时,我可以拥有这两个参数值。我知道我可以通过将这两个ViewBags值设置为隐藏字段来解决问题,而无需更改表单内容类型,但我只是想知道为什么会发生这种情况?什么影响“multiPart / form-data”表单内容类型对那些ViewBags值有什么影响?

感谢

1 个答案:

答案 0 :(得分:2)

请记住,您在网址中找到了patientIdfullName。将它们重新分配给ViewBag与它无关(删除ViewBag并查看会发生什么)

// Looks familliar? This is your first request.
Create?patientId=0&fullName=

默认情况下,参数会传递给第二个Create操作方法,因为会保留URL参数。

// By default, parameters are not cleared during the second request.
Create?patientId=0&fullName=

当您设置enctype = "multipart/form-data"时,URL参数会被清除,从而产生类似的结果。

Create

这意味着它是丢失的参数而不是ViewBag数据。

相关问题:Form Post with enctype = "multipart/form-data" causing parameters to not get passed