我正在使用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);
}
新视图模型:
public class CreateViewModel
{
public string fullname { get; set; }
public string company { get; set; }
public string type { get; set; }
}
我想将 CreateViewModel 传递到同一个"创建"视图,在该视图中,表单中填充了提取的数据,并且用户有机会验证数据。如果所有数据都正确,他将提交它(因此是第二种形式)并创建一个新的文件条目。
这就是我卡住的地方,如何制作一个接受两个视图模型的视图?或者有没有其他方法可以解决我的问题?如何暂时保存第一个 ViewModel 中的值,以便在"创建"操作中将它们一起推送到数据库?
更新
为了简单起见,我最终将这些视图和视图模型分开......我也让它与视图模型结合使用,但这导致了存储文件本身的一些问题。
很抱歉更新晚了,但由于这是一个项目,我只能在工作中作为副项目工作,我没有那么多时间。
我想到的最简单的事情是创建两个视图模型的视图模型。第一次回发时,您将拥有第一个 ViewModel 中的数据,但第二个 ViewModel 将为空。
为了存储第一个 ViewModel 中的值,从第一次回发返回到视图后,可以将值存储在隐藏字段中。这样,当您第二次回发时,这些值将可用于第一个和第二个 ViewModel。