编辑表单中的MVC 4下拉列表在从网格编辑命令后没有给出正确的值

时间:2014-02-14 08:11:02

标签: asp.net-mvc asp.net-mvc-4 edit html.dropdownlistfor

这非常奇怪,我知道这在过去有效。我必须用其他东西打破它,但我真的不知道是什么。

我是一名具有很少MVC知识的.NET程序员,似乎我在这里缺少一些关键的东西,mvc在后台做的。

让我们尽可能地解释它。

我有一个视图,其中包含:

<tbody>
        @foreach (var experienceViewModel in this.ViewData.Model)
        {
            var id = "GetExperienceDetail" + experienceViewModel.Id; 

            <tr>
                <td>@experienceViewModel.Assessment</td>
                <td>@experienceViewModel.CompanyName</td>
                <td>@experienceViewModel.Description</td>
                <td>@experienceViewModel.StartDate</td>
                <td>@experienceViewModel.EndDate</td>
                <td width="20"><a href="#" id="@id" onclick="openDetail('@id')" data-          controller="Person" data-action="ExperienceDetail" data-key="@experienceViewModel.Id" data-person="@experienceViewModel.PersonId" data-form="ExperienceDetail" title="Wijzig" class="btn btn-xs"><i class="glyphicon glyphicon-pencil"></i></a></td>
                <td width="20"><a id="@Html.Raw(id + "delete")" class="confirm-delete" data-keyname="experienceId" data-textfield="@string.Concat(experienceViewModel.Assessment, " | ", experienceViewModel.Description)" data-link="@Html.Raw(id + "delete")" data-key="@experienceViewModel.Id" data-controller="Experience" data-action="ExperienceDelete" href="#" title="Verwijder"><i class="glyphicon glyphicon-remove"></i></a></td>

            </tr>                    
        }

它不是最后一个,而是之前的那个。一个用openDetail。这个函数将从js web.js调用,我将在下面粘贴:

function openDetail(link) {
var $link = $('#' + link);

debugger;

var controller = $link.attr('data-controller');
var action = $link.attr('data-action');
var id = $link.attr('data-key');
var form = $link.attr('data-form');
var modelName = $link.attr('data-model');

//default person
if (modelName == null)
    modelName = "person";

modelName = modelName.toLowerCase();

var valueModel = $link.attr('data-' + modelName);




var json = "{\"id\" : " + id + ", \"" + modelName + "\"" + " : " + valueModel + "}";
var url = '/' + controller + '/' + action;

$.ajax({
    url: '/' + controller + '/' + action,
    type: 'POST', // not sending json over url
    data: json,
    contentType: "application/json; charset=utf-8", 
    success: function (data) {

        $('#partialoveview').html(data);

        if (typeof form !== 'undefined' && form !== false) {
            $.validator.unobtrusive.parse($('#' + form));
            $("span.field-validation-valid").hide();
            $('.label-error').hide();
        }

        loadForm();


    },
    error: function (data) {

    }
});

这个函数完成了这个工作,唯一出错的是dropdownlist,特别是那个导致下面有另一个,并且这有选择它具有的值的正确行为... < / p>

这将通过操作ExperienceDetail(int id,int person)

转到Person控制器
        [HttpPost, OutputCacheAttribute(VaryByParam = "*", Duration = 0, NoStore = true)]
    public PartialViewResult ExperienceDetail(int id, int person)
    {
        var experienceViewModel = new ExperienceViewModel { AssessmentList = this.AssessmentList(), CompanyList = this.CompanyList(), PersonId = person };


        if (id > 0)
        {
            Data.Model.Experience experience = this._experienceRepository.GetExperienceDetail(id);
            experienceViewModel = new ExperienceViewModel(experience) { AssessmentList = this.AssessmentList(), CompanyList = this.CompanyList()};
        }

        return this.PartialView("_ExperienceDetailPartial", experienceViewModel);
    }

this.CompanyList从basecontroller获取一个选择列表 返回此视图时,我无法看到此选择列表具有selectedvalue。但是再一次,正在工作的ddl在selectedvalue上也是null,所以这对于在编辑之后设置正确的值是不负责任的吗?

然后是细节屏幕,它从js放入div: 我只是在开始时首先将公司下拉(不工作)然后评估ddl(工作)

@model Emenka.HumanResources.Application.Models.ExperienceViewModel

@using (Html.BeginForm("UpdateExperienceDetail", "Person", FormMethod.Post, new { @id =    "ExperienceDetail", @role = "form", data_action = "ExperienceOverview", data_controller =    "Person" }))
{
 @Html.HiddenFor(m => m.Id)
 @Html.HiddenFor(m => m.PersonId)

 <fieldset>

<legend>Ervaring</legend>

<div class="row">

  <div class="col-md-5">

    <div class="form-group">
      @Html.LabelFor(m => m.CompanyId, new { @class = "control-label" })
      <div class="input-group col-xs-9">
        @Html.DropDownListFor(m => m.CompanyId, ViewData.Model.CompanyList,   string.Empty, new { @class = "no-focus form-control" })
        @*&nbsp;@Html.ValidationMessageFor(m => m.CompanyId, " ")*@
        <a href="#modalAdd" role="button" class="input-group-addon btnModal" data-  toggle="modal" data-target="#modalAdd" data-controller="Person" data-action="CreateCompany"   data-controlid="CompanyId" data-modaltype="Company">...</a>
      </div>
    </div>

    <div class="form-group">
      @Html.LabelFor(m => m.AssessmentId, new { @class = "control-label" })
      @Html.DropDownListFor(m => m.AssessmentId, ViewData.Model.AssessmentList,   string.Empty, new { @class = "no-focus control-sm-7 form-control" })
      @*&nbsp;@Html.ValidationMessageFor(m => m.AssessmentId, " ")*@
    </div>

    <div class="form-group">
      @Html.LabelFor(x => x.StartDate, new { @class = "control-label" })
      <div class="input-group col-xs-7">
        @Html.TextBoxFor(x => x.StartDate, new { @class = "form-control date-picker",   @readonly = "readonly" })
        <label for="StartDate" class="input-group-addon glyphicon glyphicon-calendar   add-on" />
      </div>
    </div>

我搜索过并搜索过,我不知道该搜索什么。你们能给我一些提示吗?

PS:不介意数据attrib的空格,我试图在stackoverflow(代码4空格)提交此表单时摆脱错误。

我知道下拉列表中的第三个参数是选择默认值,但这是带有评估下拉列表的string.Empty,这在单击编辑时得到正确的值,因此不是像公司下拉列表那样的空字符串......所以逻辑上这不是问题

1 个答案:

答案 0 :(得分:0)

我发现了问题!

设置链接到下拉列表的相应companyId的viewdata属性,解决了我所有的问题。我不知道为什么这在其他页面上起作用,也许我只是错过了它。

相关问题