2

何らかの理由で、モデル内の配列内のプリミティブプロパティをリモートで検証しようとすると、プロパティの値がパラメーターとして渡されません。

たとえば、リモート検証メソッド(UniqueItemNo)が呼び出されると、文字列パラメーター「id」は常にnullになります。ItemNumberではなくCartNumberで検証を実行した場合、パラメーターは正しく渡されます。

コントローラ

public class HomeController : Controller
{
    public ActionResult Index()
    {
        CartModel cart = new CartModel();
        cart.Items.Add(new ItemModel() { ItemNumber = "12345" });
        return View(cart);
    }

    [HttpPost]
    public JsonResult UniqueItemNo(string id)
    {
        /** Do Work **/
        return null;
    }
}

モデル

public class ItemModel
{
    [Remote("UniqueItemNo", "Home", HttpMethod="POST")]
    public string ItemNumber { get; set; }
}

public class CartModel
{
    public CartModel()
    {
        Items = new List<ItemModel>();
    }

    public List<ItemModel> Items { get; set; }
    public string CartNumber { get; set; }
}

意見

@{
    ViewBag.Title = "Home Page";
}

<h2>@ViewBag.Message</h2>
@using(Html.BeginForm()) {
    <p>
        @for(int i = 0; i < Model.Items.Count; i++)
        {
            @Html.TextBoxFor(m => m.Items[i].ItemNumber);
            @Html.ValidationMessageFor(m => m.Items[i].ItemNumber);                                    
        }
    </p>
}
4

4 に答える 4

7

同じ問題を解決しました。だから、将来この問題を抱える私のタイプの人々のために、ここに解決策があります

ここに根本原因があります。

あなたがするとき、それは@Html.TextBoxFor(x=>x.m.Items[i].ItemNumber) このようなものを出力します

<input type=text value='value' name='items[index].ItemNumber' ...

次に、検証用の data-* 属性などの他の検証を追加します。例: リモート検証 URL data-remot-url など

フォームが検証されると、key=xxx[1].propertyname のようなデータを含むリモート URL が要求されました。

これは、このプロパティを受け取るリモート アクション メソッドの単一の変数に割り当てることはできません。

アクション引数をこのようなものに変更すると、機能します

 public JsonResult UniqueItemNo(list<string> propertyname)

それでも、パラメーターのインデックスを0から開始し、ギャップなしで開始する必要があるため、保証されません。したがって、xxx​​[1].ItemNumber はマップされません。

残っている唯一の解決策は、クエリ文字列からプロパティ名を取得し、それを必要な変数にマップすることです。このような

    if(Request.QueryString.AllKeys.FirstOrDefault(p => p.ToLower().Contains("propertyname"))!=null)
    {
                     propertyname = Request.QueryString[Request.QueryString.AllKeys.First(p => p.ToLower().Contains("propertyname"))];
}

必要な変数を検索してマップします。

これが役立つことを願っています

于 2012-11-20T22:26:56.107 に答える
0

モデルに合わせてパラメーターを変更してみてください。このような:

    [HttpPost]
    public JsonResult UniqueItemNo(ItemModel itemModel)
    {
        // look at itemModel.ItemNumber...
        /** Do Work **/
        return null;
    }

通常のコーディング規則に従って、パラメーターの名前ActionMethodを小文字 (itemNumberではなく) で始めることもできます。ItemNumber

編集:このようにコーディングしてViewみましたか?

@{
    ViewBag.Title = "Home Page";
}

<h2>@ViewBag.Message</h2>
        @foreach (var item in Items)
        {
           @using(Html.BeginForm()) {
              <p>
                 @Html.HiddenFor(m=>m.CartNumber)
                 @Html.TextBoxFor(m => item.ItemNumber);
                 @Html.ValidationMessageFor(m => item.ItemNumber);                                    
              </p>
           }
        }
于 2012-01-20T23:04:57.807 に答える
0

残念ながら、これに対するサポートはありません。

クライアント側では、リモート検証は jquery.validate.unobtrusive.js によって処理されます。

...
$.each(splitAndTrim(options.params.additionalfields || options.element.name), function (i, fieldName) {
    var paramName = appendModelPrefix(fieldName, prefix);
    value.data[paramName] = function () {
        return $(options.form).find(":input[name='" + escapeAttributeValue(paramName) + "']").val();
    };
});
...

そのため、追加のフィールドごとに、クエリ文字列 (または投稿する場合はフォーム) で 1 つのパラメーターのみを構築することに注意してください。そのため、サーバー側のリモート属性は次のようになります

[Remote("UniqueItemNo", AdditionalFields = "ItemNumber[0],ItemNumber[1],...")]

設計時にはわからないという事実。

js ハックを使用して、ItemNumber という名前の非表示フィールドと、連結された ID リストの値を保持できます。サーバー側では、ItemNumber 配列のタイプを文字列に変更し、値を分割する必要があります。

あなたが尋ねてから長い時間が経ちましたが、これが役に立てば幸いです。

于 2013-05-14T11:42:43.153 に答える