MVC4具有多个表单的一个视图,使用首次提交的数据填充视图

时间:2013-09-18 13:36:38

标签: c# asp.net-mvc asp.net-mvc-4 razor viewmodel

我正在使用MVC4 Razor,我正在尝试制作一个非常具体的创建页面。

在此页面中,我首先要上传受密码保护的文件,因此首先提交表单。 我将此提交重定向到一个使用ViewModel“上传”的操作方法,如下所示:

public class UploadViewModel
{
    [Required]
    public HttpPostedFileBase file { get; set; }
    [Required]
    public string password { get; set; }
    public string filePath { get; set; }
}

观看:

@model Project.ViewModels.UploadViewModel

@{
     ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm("Upload", "Controller", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
         <legend>File</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.file)
        </div>
        <div class="editor-field">
            @Html.TextBoxFor(model => model.file, new { type = "file" })
            @*<input type="file" name="file" id="file" />*@
            @Html.ValidationMessageFor(model => model.file)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.password)
            @Html.ValidationMessageFor(model => model.password)
        </div>
        <p>
            <input type="submit" value="Upload" />
        </p>
    </fieldset>
}

在上传操作中,我验证了密码。如果密码正确,我从文件中提取数据并将其传递给另一个ViewModel。

上传操作:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Upload(UploadViewModel model)
{
    if (ModelState.IsValid)
    {
        //process file, load CreateViewModel and save file locally
    }

    return View("Create", newModel);
}

新的ViewModel:

public class CreateViewModel
{
    public string fullname { get; set; }
    public string company { get; set; }
    public string type { get; set; }
}

我想将CreateViewModel传递到相同的Create视图,其中表单用提取的数据填充,用户有机会验证数据。如果所有数据都是正确的,他将提交它(因此第二种形式)并创建一个新的文件条目。

这是我遇到困难的地方,我如何制作一个接受两个ViewModel的视图?或者还有其他方法可以解决我的问题吗?我如何暂时保存第一个ViewModel中的值,以便在Create操作中将它们全部推送到db?

更新

为了简单起见,我最终分离了这些视图和视图模型...... 我得到了组合视图模型的工作,但这导致了存储文件本身的一些问题。

对于迟到的更新感到抱歉,但由于这是一个项目,我只能在工作中作为辅助项目,我没有那么多时间。

1 个答案:

答案 0 :(得分:0)

我想到的最简单的事情是创建两个ViewModel的ViewModel。当您第一次回发时,您将获得第一个ViewModel的数据,但第二个ViewModel将为空。

为了存储第一个ViewModel中的值,在从第一个回发返回到视图后,可以将值存储在隐藏字段中。这样,当您第二次回发时,第一个和第二个ViewModel都可以使用这些值。