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

検証に失敗するフィールドがあると思いますが、対応する検証メッセージがないか、非表示になっているため、エラーは表示されません。おそらくこれをテストするには、送信ボタンを除くフォームの内容全体を削除して、正常に送信されるかどうかを確認します。

トラブルシューティングの手順と同じように試すもう1つのことは、これを変更することです(テスト後に復元するコメントにコピーします)。

@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 に答える