Рендеринг того же View после Http Post в MVC - PullRequest
3 голосов
/ 10 февраля 2012

Пытается опубликовать представление, но я получаю нулевое значение в поле, которое я хочу.

Вот контроллер ...

    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 ]

10 голосов
/ 10 февраля 2012

Если вы намереваетесь изменить некоторые значения модели представления в действии POST, вам сначала нужно удалить старое значение из состояния модели:

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

Причина этого в том, что Html-помощники, такие как TextBox, Hidden, ... сначала будут использовать значение в состоянии модели при связывании, а после этого значение в вашей модели представления.

Также вместо:

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

вы должны использовать:

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

Обратите внимание на строчную букву m в выражении.

3 голосов
/ 10 февраля 2012

Приведенный выше ответ является хорошим. Вы также можете сделать следующее

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

    ModelState.Clear();

    return View(vm);
}

Обычно я вызываю ModelState.Clear () перед загрузкой нового представления. Синтаксис для HiddenFor должен быть

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...