Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.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# MVC3模型编辑-返回控制器的值不正确/缺失_C#_Asp.net Mvc 3 - Fatal编程技术网

C# MVC3模型编辑-返回控制器的值不正确/缺失

C# MVC3模型编辑-返回控制器的值不正确/缺失,c#,asp.net-mvc-3,C#,Asp.net Mvc 3,我正在尝试构建一个视图,以便在MVC中编辑我的一个模型,但是当我在“Edit”方法中获得编辑后的模型时,有些属性为空,有些属性的值不正确 我已经把它简化为一个非常基本的例子,但我仍然不知道发生了什么。当我编辑模型并单击“保存”时,控制器中返回的模型具有错误的布尔值(它始终为false)。此外,我的父对象和IList对象始终为空。实际上,我永远不想编辑这些字段,在这个模型上,我只想编辑名称和活动属性。但是,它被返回为null,我的fluent NHibernate SaveOrUpdate()方法

我正在尝试构建一个视图,以便在MVC中编辑我的一个模型,但是当我在“Edit”方法中获得编辑后的模型时,有些属性为空,有些属性的值不正确

我已经把它简化为一个非常基本的例子,但我仍然不知道发生了什么。当我编辑模型并单击“保存”时,控制器中返回的模型具有错误的布尔值(它始终为false)。此外,我的父对象和IList对象始终为空。实际上,我永远不想编辑这些字段,在这个模型上,我只想编辑名称和活动属性。但是,它被返回为null,我的fluent NHibernate SaveOrUpdate()方法试图删除它们

所以我的问题是,为什么我的布尔字段总是返回false。为什么我的父字段和IList字段总是返回空值

这是我的控制器:

public ActionResult Edit(int id) {
    var clientDetail = clientRepository.Get(id);
    return View(clientDetail);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(int id, Client editedItem) {
    try {
        ValidateModel(editedItem);
        if (this.ModelState.IsValid) {
            clientRepository.SaveOrUpdate(editedItem);
            return RedirectToAction("Details", new { id = id });
        }
    } catch (Exception ex) {
        //Need to show some type of warning here...perhaps in a view bag.
    }
    return RedirectToAction("Index");
}
我的看法是:

@model Models.Client

<h2>Edit</h2>

@using (Html.BeginForm()) {
    @Html.ValidationSummary(true)
    @Html.EditorForModel()
    <input type="submit" value="Save" />
}
@model Models.Client
编辑
@使用(Html.BeginForm()){
@Html.ValidationSummary(true)
@Html.EditorForModel()
}
型号:

public class Client {
    [Display(Name="Client ID")]
    [DataType("Url")]
    [DisplayFormat(DataFormatString = "../../Client/Details/{0}/")]
    public virtual int Id { get; set; }

    public virtual Client Parent { get; set; }

    public virtual string Name { get; set; }

    [Display(Name = "Active")]
    public virtual bool Active { get; set; }

    [ScaffoldColumn(false)]
    [Editable(false)]
    public virtual IList<Login> Logins { get; set; }

}
公共类客户端{
[显示(Name=“客户ID”)]
[数据类型(“Url”)]
[DisplayFormat(DataFormatString=“../Client/Details/{0}/”)
公共虚拟整数Id{get;set;}
公共虚拟客户端父级{get;set;}
公共虚拟字符串名称{get;set;}
[显示(Name=“活动”)]
公共虚拟布尔活动{get;set;}
[脚手架立柱(假)]
[可编辑(假)]
公共虚拟IList登录名{get;set;}
}
更新:生成的HTML

<form action="/Client/Edit/17" method="post">
  <table class="editor-table">
    <tr>
      <td style="width: 10em">
        <div class="editor-label" style="text-align: right;">
          * <label for="Id">Client ID:</label>
        </div>
      </td>
      <td>
        <div class="editor-field">
          <input class="" data-val="true" data-val-number="The field Client ID must be a number." data-val-required="The Client ID field is required." id="Id" name="Id" type="text" value="17"> <span class="field-validation-valid" data-valmsg-for="Id" data-valmsg-replace="false">*</span>
        </div>
      </td>
    </tr>
  </table>
  <table class="editor-table">
    <tr>
      <td style="width: 10em">
        <div class="editor-label" style="text-align: right;">
          <label for="Name">Name:</label>
        </div>
      </td>
      <td>
        <div class="editor-field">
          <input class="" id="Name" name="Name" type="text" value="Dummy Client"> <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="false">*</span>
        </div>
      </td>
    </tr>
  </table>
  <table class="editor-table">
    <tr>
      <td style="width: 10em">
        <div class="editor-label" style="text-align: right;">
          * <label for="Active">Active:</label>
        </div>
      </td>
      <td>
        <div class="editor-field">
          <input class="check-box" type="checkbox" checked="'checked'"> <span class="field-validation-valid" data-valmsg-for="Active" data-valmsg-replace="false">*</span>
        </div>
      </td>
    </tr>
  </table><input type="submit" value="Save">
</form>

*客户端ID:
*
姓名:
*
*活动:
*
编辑器模板:

模板:

@if (!ViewData.ModelMetadata.HideSurroundingHtml) { 
    <table class="editor-table">
    <tr>
        <td style="width: 10em">
            <div class="editor-label" style="text-align: right;">
                @(ViewData.ModelMetadata.IsRequired ? "*" : "")
                <label for="@ViewData.ModelMetadata.PropertyName">@ViewData.ModelMetadata.GetDisplayName():</label>
            </div>
        </td>
        <td>
            <div class="editor-field">
                @RenderSection("EditContent")
                @Html.ValidationMessage("", "*")
            </div>
        </td>
    </tr>
</table>
}
@{
    Layout = "~/Views/Shared/EditorTemplates/_Template.cshtml";
}

@section EditContent {
    @if (ViewData.ModelMetadata.IsNullableValueType) { 
        <select class="list-box tri-state" >
            <option value="@Model.HasValue ? " : "selected='selected'">Not Set</option>
            <option value="@Model.HasValue && @Model.Value ? "selected='selected'">True</option>
            <option value="@Model.HasValue && !@Model.Value ? "selected='selected'">False</option>
        </select>
    } else {
        <input class="check-box" id="@ViewData.ModelMetadata.PropertyName" name="@ViewData.ModelMetadata.PropertyName" type="checkbox" @(Model ? "checked='checked'" : "") />
    }
}
@if(!ViewData.ModelMetadata.hidesurroundingtml){
@(ViewData.ModelMetadata.IsRequired?*:“”)
@ViewData.ModelMetadata.GetDisplayName():
@RenderSection(“编辑内容”)
@Html.ValidationMessage(“,”*”)
}
布尔模板:

@{
    Layout = "~/Views/Shared/EditorTemplates/_Template.cshtml";
}

@section EditContent {
    @if (ViewData.ModelMetadata.IsNullableValueType) { 
        <select class="list-box tri-state" >
            <option value="@Model.HasValue ? " : "selected='selected'">Not Set</option>
            <option value="@Model.HasValue && @Model.Value ? "selected='selected'">True</option>
            <option value="@Model.HasValue && !@Model.Value ? "selected='selected'">False</option>
        </select>
    } else {
        <input class="check-box" id="@ViewData.ModelMetadata.PropertyName" name="@ViewData.ModelMetadata.PropertyName" type="checkbox" @(Model ? "checked='checked'" : "") />
    }
}
@{
Layout=“~/Views/Shared/EditorTemplates/\u Template.cshtml”;
}
@第节编辑内容{
@如果(ViewData.ModelMetadata.IsNullableValueType){
未设定
假的
}否则{
}
}

通过将EditorTemplate更改为简单的:@Html.CheckBox(“,Model),我可以解决布尔字段的问题。虽然这对可为空的布尔值不起作用,但在我的例子中,我没有任何这些需要担心。这就是我的新编辑器模板的外观:

@{
    Layout = "~/Views/Shared/EditorTemplates/_Template.cshtml";
}

@model Boolean

@section EditContent {
    @Html.CheckBox("", Model)
}
以及生成的Html:

<table class="editor-table">
    <tr>
        <td style="width: 10em">
            <div class="editor-label" style="text-align: right;">
                *
                <label for="Active">Active:</label>
            </div>
        </td>
        <td>
            <div class="editor-field">
    <input checked="checked" data-val="true" data-val-required="The Active field is required." id="Active" name="Active" type="checkbox" value="true" /><input name="Active" type="hidden" value="false" />
                <span class="field-validation-valid" data-valmsg-for="Active" data-valmsg-replace="false">*</span>
            </div>
        </td>
    </tr>
</table>

*
活动:
*

希望这能帮助其他人避免我所经历的一切,但这绝对是一次学习经历。所有人,感谢上面所有有用的建议。

您的post方法不需要
id
参数,只要客户端对象就足够了,默认的模型绑定器可能会对这个额外的参数感到有点困惑。@Matt-谢谢您的提示。然而,这对这个问题没有任何影响。编辑的模型正在进入控制器,但是布尔字段总是返回false,我的复杂类型返回null。您能显示视图生成的HTML吗?看起来,
EditorForModel
没有按预期生成表单字段。@Matt-我刚刚用生成的HTML更新了帖子。我刚才想到的一件事是我正在使用EditorTemplates。不确定这是否有任何影响。在大多数情况下,它们就像Brad Wilson在Display和Editor templatesWhy ViewData.Model=clientDetail上发表的文章中所说的那样;而不是返回视图(clientDetail);