C# 控制器无法读取MVC中从视图返回的模型
我在项目中使用MVC框架,使用模型绑定填充视图,然后使用两个控制器从视图中检索值 我可以用模型属性填充视图,但当我尝试在单击提交按钮时检索值。模型返回空属性 以下是ViewModels:C# 控制器无法读取MVC中从视图返回的模型,c#,asp.net-mvc,asp.net-mvc-4,model-binding,C#,Asp.net Mvc,Asp.net Mvc 4,Model Binding,我在项目中使用MVC框架,使用模型绑定填充视图,然后使用两个控制器从视图中检索值 我可以用模型属性填充视图,但当我尝试在单击提交按钮时检索值。模型返回空属性 以下是ViewModels: public partial class QuestionAnswer { public string QuestionText { get; set; } public string QuestionId { get; set; } public string AnswerText {
public partial class QuestionAnswer
{
public string QuestionText { get; set; }
public string QuestionId { get; set; }
public string AnswerText { get; set; }
public string SectionName { get; set; }
public bool IsChecked { get; set; }
}
public partial class pluralQuestionAnswer
{
public Dictionary<int, QuestionAnswer> QnAs { get; set; }
public Dictionary<string, int> SectionNameWithRank { get; set; }
public Dictionary<string, int> SectionNameWithQuestionCount { get; set; }
}
FirstInitiative
用于通过传递视图模型生成视图,而SaveSelectedInitiatives
用于从视图检索的视图模型中获取值
以下是视图:
@using Models;
@model pluralQuestionAnswer
@{
ViewBag.Title = "FirstInitiative";
int sectionIterator;
int sectionPracticeIterator;
int totalPracticeIterator = 1;
}
<header></header>
<section>
<header>
<h1>First Initiative</h1>
</header>
@using (Html.BeginForm("SaveSelectedInitiatives", "AIP", FormMethod.Post))
{
<div class="inititive-table" style="overflow:auto">
<div class="inititive-table-header">
<div class="initiative-questioncolumn">
Common Minimum Practices
</div>
<div class="initiative-answercolumn">
Your response
</div>
</div>
@for (sectionIterator = 1; sectionIterator <= Model.SectionNameWithRank.Count; sectionIterator++)
{
<div class="initiative-section">
<div class="initiative-section-name">
<span>@Model.SectionNameWithRank.Keys.ElementAt(sectionIterator - 1)</span>
</div>
@for (sectionPracticeIterator = 1; sectionPracticeIterator <= Model.SectionNameWithQuestionCount[Model.SectionNameWithRank.Keys.ElementAt(sectionIterator - 1)]; sectionPracticeIterator++)
{
<div class="initiative-section-question initiative-questioncolumn">
<label>
@*model binding*@
@Html.HiddenFor(x => x.QnAs[totalPracticeIterator].QuestionId)
<span style="width: 20px; float:left">@Html.CheckBoxFor(x => x.QnAs[totalPracticeIterator].IsChecked)</span>
<span style="display: block; margin-left: 20px">@Html.Raw(Model.QnAs[totalPracticeIterator].QuestionText)</span>
</label><br />
</div>
<div class="initiative-section-answers initiative-answercolumn">
@Model.QnAs[totalPracticeIterator].AnswerText
</div>
{totalPracticeIterator += 1;}
}
</div>
}
</div>
<div>
<input type="submit" class="zs-left zs-button zs-button-action zs-atp-button" name="Save" value="Save" />
</div>
}
</section>
@使用模型;
@模型多重问题答案
@{
ViewBag.Title=“FirstInitiative”;
整数段迭代器;
内科医生;
int TotalPracticeInterator=1;
}
第一倡议
@使用(Html.BeginForm(“SaveSelectedInitiatives”、“AIP”、FormMethod.Post))
{
最低限度共同做法
你的回答
@对于(sectionIterator=1;sectionIterator x.QnAs[totalPracticeIterator].IsChecked)
@Html.Raw(Model.QnAs[TotalPracticeInterator].QuestionText)
@Model.QnAs[totalPracticeIterator].回答文本
{TotalPracticeInterator+=1;}
}
}
}
您可能需要重命名您的输入
以匹配您的模型的KeyValuePair模式,因此请替换以下内容:
@Html.HiddenFor(x => x.QnAs[totalPracticeIterator].QuestionId)
与
因此,从浏览器发布的数据如下所示:
QnAs[0].Key = 1
QnAs[0].Value.QuestionId = 123
QnAs[1].Key = 32
QnAs[1].Value.QuestionId = 55
您可能需要重命名
输入
,以匹配模型的KeyValuePair架构,因此请替换以下内容:
@Html.HiddenFor(x => x.QnAs[totalPracticeIterator].QuestionId)
与
因此,从浏览器发布的数据如下所示:
QnAs[0].Key = 1
QnAs[0].Value.QuestionId = 123
QnAs[1].Key = 32
QnAs[1].Value.QuestionId = 55
在字典对象中,将键从
int
type更改为string
type,这应该可以工作。在字典对象中,将键从int
type更改为string
type,这应该可以工作。您没有任何输入标记,因此不会发送数据。使用Fiddler或DevTool查看哪些信息(如果有的话)正在获取到您的api。首先,您无法使用任何HtmlHelper
方法为控件生成正确的for绑定到Dictionary
。而您的nested
for`loop毫无意义,因为DefaultModelBinder
需要集合索引器启动并且是连续的(除非您包含索引器的输入),您可能需要查看,请参阅了解在复杂属性的情况下为什么不应使用词典
,使用EditorTemplates
是更干净、更好的方法。这里缺少基本的HTML逻辑,只有input
标记从客户端发布到服务器,您只有一个,即QuestionId
。另外阅读类
和参数
命名约定。您没有任何输入标记,因此不会发送数据。使用Fiddler或DevTool查看哪些信息(如果有的话)正在获取到您的api。首先,您无法使用任何HtmlHelper
方法为控件生成正确的for绑定到Dictionary
。而您的nested
for`loop毫无意义,因为DefaultModelBinder
需要集合索引器启动并且是连续的(除非您包含索引器的输入),您可能需要查看,请参阅了解在复杂属性的情况下为什么不应使用词典
,使用EditorTemplates
是更干净、更好的方法。这里缺少基本的HTML逻辑,只有input
标记从客户端发布到服务器,您只有一个,即QuestionId
。另外阅读类
和参数
命名约定。但这将改变基础模型!,如果只需要int
,该怎么办?@GauravSinghJantwal您可以始终使用int.ToString()将int转换为字符串。这意味着您仍然可以有数字,但以字符串的形式,但这将改变基础模型!,如果只需要int
,该怎么办?@GauravSinghJantwal您可以始终使用int.ToString()将int转换为字符串。这意味着您仍然可以有数字,但可以是字符串形式
QnAs[0].Key = 1
QnAs[0].Value.QuestionId = 123
QnAs[1].Key = 32
QnAs[1].Value.QuestionId = 55