asp.net-mvc - net - html textboxfor example



具有數據屬性的SelectListItem (4)

MVC將對象名稱轉換為屬性名稱時,它將“_”與“ - ”相關聯,因此它:

@Html.DropDownList(a=>a.websiteid, Model.GetItems, new{ data_rel="selected" })

不是我的答案,回答來自ASP> NET論壇的關於bruce(sqlwork.com)的信條。

如何在dropdownlist中為htmlAttributes添加data-rel =“selected”屬性?

只是希望能幫助我解決這個問題! 請享用。

https://code.i-harness.com

無論如何在ViewModel上預先填充了具有數據屬性的SelectList嗎?

我想要做

@Html.DropdownListFor(m=> m.CityId, Model.Cities);

所以它生成如下代碼:

<select id="City" class="location_city_input" name="City">
    <option data-geo-lat="-32.522779" data-geo-lng="-55.765835" data-geo-zoom="6" />
    <option data-geo-lat="-34.883611" data-geo-lng="-56.181944" data-geo-zoom="13" data-geo-name="Montevideo" data-child=".state1" value="1">Montevideo</option>               
    <option data-geo-lat="-34.816667" data-geo-lng="-55.95" data-geo-zoom="13" data-geo-name="Canelones, Ciudad de la Costa" data-child=".state41" value="41">Ciudad de la Costa</option>
</select>


這是我在沒有擴展的情況下最終完成的方法,但仍然允許不顯眼的驗證繼續工作並綁定到ViewModel屬性。

創建一個Html Helper以將驗證屬性作為字符串獲取:

    public static IHtmlString GetUnobtrusiveValidationAttributesFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> propertySelector)
    {
        string propertyName = html.NameFor(propertySelector).ToString();
        ModelMetadata metaData = ModelMetadata.FromLambdaExpression(propertySelector, html.ViewData);
        IDictionary<string, object> attributeCollection = html.GetUnobtrusiveValidationAttributes(propertyName, metaData);

        return html.Raw(String.Join(" ", attributeCollection.Select(kvp => kvp.Key + "=\"" + kvp.Value.ToString() + "\"")));
    }

在視圖的select列表中使用此幫助程序:

<select name="@Html.NameFor(m => m.CityId)" id="@Html.IdFor(m => m.CityId)"
    @Html.GetUnobtrusiveValidationAttributesFor(m => m.CityId)
    class="location_city_input">
    @foreach(var city in Model.Cities)
    {
        <option value="@city.Id.ToString()" @(city.Id == Model.CityId ? "selected" : "") 
            data-geo-lat="@city.Lat" data-geo-lng="@city.Lng" data-geo-zoom="@city.Zoom">
            @city.Name
        </option>
    }
</select>

這將輸出如下內容:

<select id="CityId" name="CityId" 
    data-val-required="The SelectedTaxRateID field is required." data-val="true" 
    class="location_city_input">
    <option value="1" selected data-geo-lat="-34.883611" data-geo-lng="-56.181944" data-geo-zoom="13">Montevideo</option>               
    <option value="41" data-geo-lat="-34.816667" data-geo-lng="-55.95" data-geo-zoom="13">Ciudad de la Costa</option>
</select>

我將保留條件data-屬性,因為這些只是形成適當的Razor表達式的問題。


這是簡單的解決方案。

並非所有內容都必須使用.NET代碼中的擴展方法編寫。 MVC的一大優點是它可以讓您輕鬆訪問構建自己的HTML。

使用MVC4,您可以使用幫助程序HTML.NameForHTML.IdFor表達式樹上元素的id和名稱

<select name="@Html.NameFor(Function(model) model.CityId)"
        id="@Html.IdFor(Function(model) model.CityId)"
        class="location_city_input">
    @For Each city In Model.Cities
        @<option value="@city.Value"
                 @(If(city.Value = Model.CityId, "selected", ""))
                 data-geo-lat="@city.Lat"
                 data-geo-lng="@city.Lng"
                 data-geo-zoom="@city.Zoom">
            @city.Text
        </option>
    Next
</select>

假設Model.Cities是暴露每個屬性的項的集合。 那麼你應該全力以赴。

如果您想要可重用性,請考慮將其作為“Enumerable of Cities”的任何內容的編輯器模板





selectlist