我使用以下操作允许用户查看Excel导入的预览
[HttpGet]
[Authorize]
public ActionResult ImportVerify()
{
string temp_sessionname = "ImportedData_" + User.Identity.Name;
List<ProjectImportModel> view_model = (List<ProjectImportModel>)TempData[temp_sessionname];
return View(view_model);
}
[HttpPost]
[Authorize]
public ActionResult ImportVerify(List<ProjectImportModel> model)
{
return View(model);
}
在View上我正在使用一个表来显示来自excel的导入数据列表,并要求用户确认导入操作
我的观点是这样的
<h2>Import Verify</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
//table with all details and a submit button in the end
<div class="form-group">
<div class="col-md-10" style="text-align:center;">
<input type="submit" value="Submit" class="btn btn-primary" />
</div>
</div>
}
模特是
public class ProjectImportModel
{ public string Page {get;组; }
public string Author { get; set; }
public string Translator { get; set; }
public string Holder { get; set; }
public string Title { get; set; }
public string TrTitle { get; set; }
//and similar 20 more properties of string type
}
但是在POST上,列表为空
是否可以在POST事件中获取列表。我的意图只是允许用户预览
或者我是否需要从TempData @ post重新填充List?
答案 0 :(得分:3)
为了发回一个集合,您需要为属性编制索引,如果他们只读取,您可以将HiddenFor与模型一起使用。
如果您希望用户对其进行编辑,请将其更改为TextBoxFor's
或更改您需要的控件。
@model List<ProjectImportModel>
<h2>Import Verify</h2>
@using (Html.BeginForm())
{
@Html.ValidationSummary(true)
//table with all details and a submit button in the end
<div class="form-group">
<div class="col-md-10" style="text-align:center;">
@for(var i = 0 ; i < Model.Count; i++)
{
@Html.HiddenFor(m => m[i].Foo)
@Model[i].Foo <br/>
}
<input type="submit" value="Submit" class="btn btn-primary" />
</div>
</div>
}
我只使用了Foo
的虚拟属性而没有看到你的模型。
显然你也想要显示数据。
答案 1 :(得分:1)
我没有看到设置TempData
的代码段。所以我打算在另一个Action中设置它,然后重定向到ImportVerify
Action
TempData保存HTTP请求时间的信息。这仅意味着从一个页面到另一个页面。这意味着在重定向到您的ImportVerify Get
操作后,数据已过期。如果您想保留数据,可以尝试以下方法:
Session
代替TempData
答案 2 :(得分:0)
将列表发布回控制器有一些要求。具体来说,索引必须基于0且不间断(例如,您可以使用索引[0],[1],[2]绑定列表,但不能绑定[0],[1],[3]或[1] ,[2],[3]。
或者,您可以编写自定义模型绑定器以按您喜欢的方式解析请求主体。
有关此内容的更多信息:http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx/
编辑: 以下是如何执行此操作的示例:
给出以下模型
public class ExampleModel
{
public int Field1 {get; set;}
public string Field2 {get; set;}
}
以下行动
[HttpGet]
[Authorize]
public ActionResult ImportVerify()
{
List<ExampleModel> model = //populate the list somehow
return View(model);
}
[HttpPost]
[Authorize]
public ActionResult ImportVerify(List<ExampleModel> model)
{
//do something
}
示例视图“ImportVerify.cshtml”将是:
@model List<ExampleModel>
@using(Html.BeginForm())
{
for(var i = 0; i < Model.Count; i++)
{
<div>
@Html.HiddenFor(m => m[i].Field1);
@Html.HiddenFor(m => m[i].Field2);
<p>
Value @i : Field1 = @m[i].Field1 , Field2 = @m[i].Field2
</p>
</div>
}
<input type="submit" value="Send"/>
}
另外,我会稍微修改你的逻辑,以避免使用TempData(通常是不好的做法)并允许强类型视图。