C# 从视图发布时列表为空
我使用以下操作允许用户查看Excel导入的预览C# 从视图发布时列表为空,c#,asp.net,asp.net-mvc,razor,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Razor,Asp.net Mvc 5,我使用以下操作允许用户查看Excel导入的预览 [HttpGet] [Authorize] public ActionResult ImportVerify() { string temp_sessionname = "ImportedData_" + User.Identity.Name; List<ProjectImportModel> view_model = (List<ProjectImportModel>)TempData[temp_sessi
[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);
}
{
公共字符串页{get;set;}
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上,列表为空
是在活动结束后获取列表的任何方法。我的意图只是允许用户预览
或者我也需要从TempData@post重新填充列表吗?为了将集合发回,您需要对属性进行索引,如果属性是只读的,您可以将HiddenFor与模型一起使用。 如果您希望用户编辑它们,请将它们改为
TextBoxFor的
,或者更改为数据所需的控件
@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>
}
@型号列表
导入验证
@使用(Html.BeginForm())
{
@Html.ValidationSummary(true)
//表中包含所有详细信息,最后还有一个提交按钮
@对于(var i=0;im[i].Foo)
@模型[i].Foo
}
}
我只是使用了Foo
的虚拟属性,没有看到您的模型
显然,您也希望显示数据
将列表发回控制器有一些要求。具体来说,索引必须是基于0且不间断的(例如,您可以用索引[0]、[1]、[2]绑定列表,但不能用索引[0]、[1]、[3]或[1]、[2]、[3]绑定列表) 或者,您可以编写自定义模型绑定器,以您喜欢的方式解析请求体 更多信息请点击此处: 编辑: 下面是一个如何执行此操作的示例: 给定以下模型
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
}
[HttpGet]
[授权]
公共行动结果导入验证()
{
列表模型=//以某种方式填充列表
返回视图(模型);
}
[HttpPost]
[授权]
公共行动结果导入验证(列表模型)
{
//做点什么
}
示例视图“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"/>
}
@型号列表
@使用(Html.BeginForm())
{
对于(var i=0;im[i].Field1);
@Html.HiddenFor(m=>m[i].Field2);
值@i:Field1=@m[i]。Field1,Field2=@m[i]。Field2
}
}
另外,我会稍微修改一下您的逻辑,以避免使用TempData(通常是不好的做法)并允许强类型视图。我没有看到设置
TempData
的代码片段。因此,我打算您在另一个操作中设置它,然后重定向到ImportVerify
操作
TempData保留HTTP请求时的信息。这意味着只能从一个页面转到另一个页面。这意味着重定向到ImportVerify Get
操作后,数据将过期。如果要保留数据,可以尝试以下方法:
- 在页面中创建隐藏列表
- 使用
而不是Session
TempData
ProjectImportModel
属性ies?使用模型属性编辑的问题我已经从get上的TempData获取了列表。从TempData@POST重新编码是否也有性能缺陷?我已经提到,在问题的最后,我必须添加Hiddenfield,几乎16个properties@JMat我更喜欢使用强类型模型,减少出错的空间,这就是我发布它们的方式回到控制器。但是我如何才能使它成为强类型模型。在我的例子中,我有一个具有15个属性和项目列表的模型。你能推荐一些吗samples@StephenMuecke通常,发送/接收一些额外的HTML/post数据要比查询数据库快得多。到数据库的额外往返是开销。至于过度发布因为TempData
是一个简短的tempSession
,所以我建议您使用Session
存储列表,需要时可以删除。
[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
}
@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"/>
}