1

我是 MVC 的新手,但我一直在对另一个组创建的现有代码进行一些更改。

有一个包含多个部分视图的用户数据视图,我想更新“个人资料”部分(姓名、电话等)。问题是点击“保存”按钮什么也没做。在控制器上设置断点甚至不会显示站点到达该代码。

这些是当前代码的主要部分。

“用户详细信息”视图:

@model UserDetailsModel

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

...

<h2>User Details</h2>
...
<hr />

<div class="row">
    <div class="span2">
    <ul class="nav nav-pills nav-stacked" id="js-side-nav" data-spy="affix">
        <li class="active"><a href="#profile">Profile</a></li>
        <li><a href="#userdevices">Functions</a></li>
...
    </ul>
</div>
<div class="span10">
    <ul class="unstyled">
        <li id="profile">
            <h3>Profile</h3>
            @Html.Partial("_UserProfile", Model.ProfileModel)
            <hr />
        </li>
        <li id="functions">
            <h3>Functions</h3>
            @Html.Partial("_UserFunctions", Model.FunctionsModel)
            <hr />
        </li>
...

“用户资料”部分视图:

// (我添加了 HttpMethod = "Post")

@model UserProfileModel

<section id="user-profile-section">
    @using (Ajax.BeginForm("UserProfile", "UserDetail", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "user-profile-section", InsertionMode = InsertionMode.Replace}))
{
    @Html.EditorForModel("CustomForm")
    <input class="btn btn-primary" type="submit" value="Save Profile"/>
}
</section>

“用户详细信息”控制器:

//(我添加了[System.Web.Http.HttpPost])

[System.Web.Http.HttpPost]
public ActionResult UserProfile(Guid userId, [FromBody] UserProfileModel model)
{
if(!Request.IsAjaxRequest())
    throw new Exception("Expecting ajax request");

if(!ModelState.IsValid)
        return PartialView("_UserProfile", model);

var service = new UserService();
    WebUser user = service.GetUserProfile(userId, SessionState.ApplicationId);
    Mapper.DynamicMap(model, user.Profile, model.GetType(), user.Profile.GetType());
    service.UpdateUser(user);

return PartialView("_UserProfile", model);
}

“用户档案”模型:

using System.ComponentModel.DataAnnotations;

namespace UserDetail
{
public class UserProfileModel
{
    [Required]
    [Display(Name = "First Name")]
    public string ContactFirstName { get; set; }

    [Required]
    [Display(Name = "Last Name")]
    public string ContactLastName { get; set; }

    [Display(Name = "Business Phone")]
    public string ContactBusinessPhone { get; set; }

...

ClientValidationEnabled 和 UnobtrusiveJavaScriptEnabled 在 web.config 上设置为 TRUE。

我首先想让代码到达控制器中的 UserProfile 部分,这样我才能确保 service.UpdateUser() 方法有效。我已经检查、搜索并尝试了几个选项,但我没有找到我所缺少的。最后,显然,我希望能够更新数据。

谢谢。

4

1 回答 1

0

我敢打赌你有一些字段验证失败,但它没有相应的验证消息或被隐藏,因此你没有看到错误。也许要对此进行测试,只需删除除提交按钮之外的表单的全部内容,然后查看它是否成功提交。

作为故障排除步骤尝试的另一件事是更改(将其复制到评论以在测试后恢复)这个

@using (Ajax.BeginForm("UserProfile", "UserDetail", new AjaxOptions { HttpMethod = "Post", UpdateTargetId = "user-profile-section", InsertionMode = InsertionMode.Replace}))

...到一个简单的 Html.BeginForm,只是为了确定/排除这里的 AJAX 有问题的可能性,也许无法找到 UpdateTargetId。

另外,在 Chrome 上打开 F12,切换到控制台选项卡,刷新页面并提交,看看是否出现任何 javascript 错误。

最后,尝试暂时删除 [FromBody] 属性作为测试。一些属性会影响路由,我不确定这个是否会,因为我从未使用过它。

于 2013-01-11T20:12:54.643 回答