Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从视图发布时列表为空_C#_Asp.net_Asp.net Mvc_Razor_Asp.net Mvc 5 - Fatal编程技术网

C# 从视图发布时列表为空

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

我使用以下操作允许用户查看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);
}
{ 公共字符串页{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类的代码?能否显示您的
ProjectImportModel
属性ies?使用模型属性编辑的问题我已经从get上的TempData获取了列表。从TempData@POST重新编码是否也有性能缺陷?我已经提到,在问题的最后,我必须添加Hiddenfield,几乎16个properties@JMat我更喜欢使用强类型模型,减少出错的空间,这就是我发布它们的方式回到控制器。但是我如何才能使它成为强类型模型。在我的例子中,我有一个具有15个属性和项目列表的模型。你能推荐一些吗samples@StephenMuecke通常,发送/接收一些额外的HTML/post数据要比查询数据库快得多。到数据库的额外往返是开销。至于过度发布因为
TempData
是一个简短的temp
Session
,所以我建议您使用
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"/>
}