数据视图不同谢谢后端

时间:2013-11-13 17:19:32

标签: c# javascript asp.net-mvc razor

简单来说,我正在使用磁条读卡器扫描驾驶执照,使用javascript RegEx获取我需要的数据,通过ajax调用将数据作为JSON发送到服务器,然后发回部分视图使用Ajax.BeginForm并填写数据。

事实上,所有这些都很有效。问题是我在将数据发送到视图之前尝试在C#中更改服务器上的数据,但无论我做什么,原始的非格式化数据仍会显示在页面上。我甚至逐步完成了整个过程,查看视图的模型数据表明它收到了正确的数据。然而,当显示视图时,非格式化数据(当我浏览它时,模型对象中实际上不存在)是显示在文本框中的数据。

function LoadVisitorCreatePartial(CardData) {
$.post(webroot + "Visitor/GetVisitorLogCreateVisitorForm", CardData, function (data) {
    $('#visitor-info').append(data);
});

}

以上是我用于通话的相关javascript。我使用Carl Raymond's jquery card swipe来提取数据,我实现了一些自己的RegEx来获取“CardData”所需的数据,即JSON。

[HttpPost]
public ActionResult GetVisitorLogCreateVisitorForm(DriversLicenseForm CardData)
{
    var form = visitorService.GetForm(CardData);
    return PartialView("Form", form);
}

以上是正在调用的控制器函数。 DriversLicenseForm本质上是JSON对象,作为C#类。

public VisitorForm GetForm(DriversLicenseForm CardData)
{
    var textInfo = CultureInfo.InvariantCulture.TextInfo;
    var DateOfBirth = DriversLicense.ParseDriversLicenseDate(CardData.DateOfBirthString);

    CardData.FirstName = ConvertToTitleCase("i'm ron burgundy?"); 
    CardData.LastName = textInfo.ToTitleCase(CardData.LastName);
    var form = new VisitorForm();
    if (DateOfBirth != null)
    {
        CardData.DateOfBirth = Convert.ToDateTime(DateOfBirth);
    }
    form = Mapper.Map<VisitorForm>(CardData);
    form.ID = -1;
    form = SetFormProperties(form);
    return form;
}

在上面的代码中你可以看到我生气了。我决定手动设置名称,尽管我将CardData.FirstName设置为完全不同的东西(在调试模式中逐步验证时),当表单返回时,它只显示我的驱动程序许可证名称。我还有两个标题案例函数,因为最初我认为这是问题,并发现了一个非textinfo解决方案,虽然没有改变,在调试单步调试后,CardData中的数据正在被更改和更新。我觉得值得注意的是,在CardData的调试模式下更改数据并且在AutoMapper将其映射出来后的形式中,我的代码看起来工作正常,但实际视图显示原始数据,尽管没有引用或者它甚至知道数据存在的原因。

我完全不知道该做什么。

编辑:这是视图代码

@using (Ajax.BeginForm("PostForm", "Visitor", new AjaxOptions { HttpMethod = "POST",     UpdateTargetId = "visitor-info", OnSuccess = "VisitorPostback" }))
{
@Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    @Html.HiddenFor(model => model.ID)

    <div class="editor-label">
        @Html.LabelFor(model => model.LastName)
    </div>
    <div class="editor-field">
        @Html.TextBoxFor(model => model.LastName, new { @class = "focus" })
        @Html.ValidationMessageFor(model => model.LastName)
    </div>
<p>
    <input type="submit" class="btn btn-primary" value="Save" />
</p>
}

我删除了很多实际的文本框,但是留下了一个例子。他们都以同样的方式完成。

1 个答案:

答案 0 :(得分:1)

将数据发送到MVC Post操作方法时,ModelState会填充您发送的数据。这适用于POST表单有验证错误的情况,您可以简单地返回视图,并显示所有用户表单输入以及验证错误。

通常在POST之后,您会将(PRG - &gt; Post Redirect Get)重定向到另一个操作方法,但看起来您可以轻松地在此处执行此操作。

看起来那些ModelState值被保存在“Form”视图的返回上,并将它们绑定到匹配的表单元素。尝试将ModelState.Clear()添加到您的POST操作方法中,看看是否是导致此问题的原因。

[HttpPost]
public ActionResult GetVisitorLogCreateVisitorForm(DriversLicenseForm CardData)
{
    ModelState.Clear();
    var form = visitorService.GetForm(CardData);
    return PartialView("Form", form);
}