Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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# 控制器无法读取MVC中从视图返回的模型_C#_Asp.net Mvc_Asp.net Mvc 4_Model Binding - Fatal编程技术网

C# 控制器无法读取MVC中从视图返回的模型

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 {

我在项目中使用MVC框架,使用模型绑定填充视图,然后使用两个控制器从视图中检索值

我可以用模型属性填充视图,但当我尝试在单击提交按钮时检索值。模型返回空属性

以下是ViewModels:

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