在MVC中Http Post之后渲染相同的视图

时间:2012-02-10 08:47:45

标签: asp.net-mvc-3

尝试重新发布一个视图,但我对我想要的字段变为空。

继承人......

    public ActionResult Upload()
    {
        VMTest vm = new VMTest();
        return View(vm);
    }

    [HttpPost]
    public ActionResult Upload(VMTest vm, String submitButton)
    {
        if (submitButton == "Upload")
        {
            //do some processing and render the same view
            vm.FileName = "2222";           // dynamic creation of filename
            vm.File.SaveAs(@vm.FileName);   // save file to server
            return View(vm);
        }
        else if (submitButton == "Save")
        {
            //read the file from the server
            FileHelperEngine engine = new FileHelperEngine(typeof(PaymentUploadFile));
            PaymentUploadFile[] payments = (PaymentUploadFile[])engine.ReadFile(@vm.FileName);  // the problem lays here @vm.FileName has no value during upload

            //save the record of the file to db
            return View("Success");
        }
        else
        {
            return View("Error");
        }
    }

我的视图中已经有了@ Html.HiddenFor(model => Model.FileName)。

但我仍然得到了Model.FileName的空值。

任何帮助

由于

2 个答案:

答案 0 :(得分:10)

如果您打算在POST操作中修改视图模型的某些值,则需要先从modelstate中删除旧值:

ModelState.Remove("FileName");
vm.FileName = "2222"; 

这样做的原因是,TextBox,Hidden,...等Html助手将首先在绑定时使用模型状态中的值,然后在视图模型中使用值。

而不是:

@Html.HiddenFor(model => Model.FileName)

你应该使用:

@Html.HiddenFor(model => model.FileName)

注意表达式中的小写m

答案 1 :(得分:3)

上述答案很好。您还可以执行以下操作

public ActionResult Upload()
{
    VMTest vm = new VMTest();

    ModelState.Clear();

    return View(vm);
}

我通常在加载新视图之前调用ModelState.Clear()。 HiddenFor的sytntax应该是

@Html.HiddenFor(m => m.FileName);

我希望这会有所帮助。