0

EditorFor 拡張メソッドを使用してチェックボックスのリストをレンダリングしようとする mvc Web プロジェクトがありますが、結果はチェックボックスのリストではなくテキストとして ID を表示するだけです。

ビュー内のコードは次のとおりです。

  <div id="permissions" class="tab-body">
     @Html.Label("Permissions :")
     @Html.EditorFor(x => Model.Permissions)
     <br />
     <br />
  </div>

これは、オブジェクト「モデル」のプロパティ「アクセス許可」です。

  [DisplayName("Permissions")]
  public List<PermissionViewModel> Permissions { get; set; }

これは PermissionViewModel です。

public class PermissionViewModel { public int Id { get; 設定; }

  public UserGroupPermissionType Name { get; set; }

  public string Description { get; set; }

  public bool IsDistributable { get; set; }

  public bool IsGranted { get; set; }

}

最後に、ブラウザでの結果は次のとおりです。

<div id="permissions" class="tab-body" style="display: block;">
<label for="Permissions_:">Permissions :</label>
192023242526272829
<br>
<br>
</div>

html が正しく生成されない理由がわかりましたか? 依存関係がありませんか? 依存関係の競合?Web.Config が正しく構成されていませんか?

大変お世話になりました。

4

2 に答える 2

2

「PermissionViewModel」クラスのエディター テンプレートを作成する必要があるように見えます。現在、MVC は、このような複雑なオブジェクトのエディターを作成する方法と混同されているようです。

ビューが提供されているフォルダーに、「EditorTemplates」というフォルダーを追加します。

次に、そのフォルダーに新しい部分ビューを追加します。コードは次のようになります。

@model IEnumberable<PermissionViewModel>
@foreach(var permission in Model)
@Html.EditorFor(x => x.Name)
@Html.EditorFor(x => x.Description)
@Html.EditorFor(x => x.IsDistributable)
@Html.EditorFor(x => x.IsGranted)

Name クラスの Editor Template も作成する必要があります。

これで、ビューで呼び出すことができます

<div id="permissions" class="tab-body">
 @Html.Label("Permissions :")
 @Html.EditorFor(x => Model.Permissions)
 <br />
 <br />
</div>

そして、MVC は、許可のために作成したばかりのエディター テンプレートを使用することを認識します。

エディター テンプレートについて学習するための優れたリソースは、http: //bradwilson.typepad.com/blog/2009/10/aspnet-mvc-2-templates-part-1-introduction.htmlです。

于 2012-06-15T19:54:39.453 に答える
2

たぶん、あなたは自分で何かを作りたいですか?

    public delegate object Property<T>(T property);

    public static HtmlString MultiSelectListFor<TModel, TKey, TProperty>(
        this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, IEnumerable<TKey>>> forExpression,
        IEnumerable<TProperty> enumeratedItems,
        Func<TProperty, TKey> idExpression,
        Property<TProperty> displayExpression,
        Property<TProperty> titleExpression,
        object htmlAttributes) where TModel : class
    {
        //initialize values
        var metaData = ModelMetadata.FromLambdaExpression(forExpression, htmlHelper.ViewData);
        var propertyName = metaData.PropertyName;
        var propertyValue = htmlHelper.ViewData.Eval(propertyName).ToStringOrEmpty();
        var enumeratedType = typeof(TProperty);

        //check for problems
        if (enumeratedItems == null) throw new ArgumentNullException("The list of items cannot be null");

        //build the select tag
        var returnText = string.Format("<select multiple=\"multiple\" id=\"{0}\" name=\"{0}\"", HttpUtility.HtmlEncode(propertyName));
        if (htmlAttributes != null)
        {
            foreach (var kvp in htmlAttributes.GetType().GetProperties()
             .ToDictionary(p => p.Name, p => p.GetValue(htmlAttributes, null)))
            {
                returnText += string.Format(" {0}=\"{1}\"", HttpUtility.HtmlEncode(kvp.Key),
                 HttpUtility.HtmlEncode(kvp.Value.ToStringOrEmpty()));
            }
        }
        returnText += ">\n";

        //build the options tags
        foreach (TProperty listItem in enumeratedItems)
        {
            var idValue = idExpression(listItem).ToStringOrEmpty();
            var displayValue = displayExpression(listItem).ToStringOrEmpty();
            var titleValue = titleExpression(listItem).ToStringOrEmpty();
            returnText += string.Format("<option value=\"{0}\" title=\"{1}\"",
                HttpUtility.HtmlEncode(idValue), HttpUtility.HtmlEncode(titleValue));
            if (propertyValue.Contains(idValue))
            {
                returnText += " selected=\"selected\"";
            }
            returnText += string.Format(">{0}</option>\n", HttpUtility.HtmlEncode(displayValue));
        }

        //close the select tag
        returnText += "</select>";
        return new HtmlString(returnText);
    }
于 2012-06-15T19:43:25.963 に答える