1

ビューにこのコードがあります

@using (Html.BeginForm("Add", "AdminUsers"))
{
<div class="control-group">
    <span class="control-label">* Role:</span>
    <div class="controls">
        <select name="Role">
            <option value="@Argussite.SupplierService.Core.Domain.Role.Manager" 
                @if (Model.Role == Argussite.SupplierService.Core.Domain.Role.Manager) { <text>selected="selected"</text> }>
                @Argussite.SupplierService.Core.Domain.Role.ManagerTitle</option>
            <option value="@Argussite.SupplierService.Core.Domain.Role.ChiefManager"
                @if (Model.Role == Argussite.SupplierService.Core.Domain.Role.ChiefManager) { <text>selected="selected"</text> }>
                @Argussite.SupplierService.Core.Domain.Role.ChiefManagerTitle</option>
            <option value="@Argussite.SupplierService.Core.Domain.Role.Ceo"
                @if (Model.Role == Argussite.SupplierService.Core.Domain.Role.Ceo) { <text>selected="selected"</text> }>
                @Argussite.SupplierService.Core.Domain.Role.CeoTitle</option>
        </select>
    </div>
</div>

//...

<div class="control-group">
    <span class="control-label">* Phone:</span>
    <div class="controls">
        @Html.TextBoxFor(m => m.PhoneNumber)
        @Html.ValidationMessageFor(m => m.PhoneNumber, null, new {@class="text-error"})
    </div>
</div>

<div class="control-group">
    <div class="controls">
        <button type="submit" class="btn btn-primary">Add</button>
        <a href="@Url.Action("Index", "AdminUsers")" class="btn">Cancel</a>
    </div>
</div>
}

そして、リストで選択した場合はチェックを追加する必要があります

Model.Role == Argussite.SupplierService.Core.Domain.Role.Manager

私は示す必要があります

<div class="control-group">
    <span class="control-label">* Phone:</span>
    <div class="controls">
        @Html.TextBoxFor(m => m.PhoneNumber)
        @Html.ValidationMessageFor(m => m.PhoneNumber, null, new {@class="text-error"})
    </div>
</div>  

リストで選択した値を変更した場合

Model.Role == Argussite.SupplierService.Core.Domain.Role.ChiefManager

また

Model.Role == Argussite.SupplierService.Core.Domain.Role.Ceo

* なしで電話フィールドを表示する必要があり、このフィールドを検証する必要はありません。
どうやってやるの?
それは私のコントロールです

 [HttpPost]
    public ActionResult Add(AddArgussoftUserInput input)
    {
        if ((input.Role == Role.Manager || input.Role == Role.ChiefManager) && string.IsNullOrWhiteSpace(input.PhoneNumber))
        {
            ModelState.AddModelError("PhoneNumber", "Please, provide a valid Phone Number");
        }
        if (!Context.IsUserNameUnique(input.Name))
        {
            ModelState.AddModelError("Name", AddArgussoftUserInput.NameIsNotUniqueError);
        }
        if (!Context.IsUserEmailUnique(input.Email))
        {
            ModelState.AddModelError("Email", AddArgussoftUserInput.EmailIsNotUniqueError);
        }

        if (!ModelState.IsValid)
        {
            return View(input);
        }

        var user = new User(input.Name, input.Email, input.FullName, input.Role, input.PhoneNumber);
        Context.Users.Add(user);

        Register(new UserCreatedNotification(user, null /* supplier */, UrlBuilder));
        TriggerPopupSuccess(string.Format("Account '{0}' for user {1} has been created.", input.Name, input.FullName));

        return RedirectToAction("Index");
    }
4

2 に答える 2

1

MvcHtml を拡張した HtmlHelper を作成できます。私はこの問題をこのように処理しましたが、カスタムの権限属性を使用しています。

namespace System.Web.Mvc.Html
{
public static class HtmlHelperExtensions
{
    public static MvcHtmlString AuthorizeCeo()
    {
        return Model.Role == "Ceo" ? value : MvcHtmlString.Empty;
    }
}

このようにして、次のように使用できます。

@Html.ActionLink("Phonenumber *", "actionName", "controllerName").AuthorizeCeo()

また、ユーザーが承認されている場合にのみ表示されます。

于 2013-06-26T14:08:51.087 に答える
1

jQuery を使用して、選択リストの変更イベントをフックし、選択したロールに基づいて div を表示できます。

ここで表示する簡単な jsFiddle をセットアップしました http://jsfiddle.net/nwdev/X5Zva/

<select id="RoleList">
    <option value="Manager">Manager</option>
    <option value="CEO">CEO</option>
</select>

<div id="RequiredPhone">
    phone field with validation
</div>
<div id="OptionalPhone">
    optional phone field here
</div>

そして、それを接続するためのいくつかのjQuery...

jQuery(function() {
jQuery('#RequiredPhone').hide();
jQuery('#OptionalPhone').hide();
});

function updateOption() {
    jQuery('#RequiredPhone').toggle(this.value == 'Manager');
    jQuery('#OptionalPhone').toggle(this.value == 'CEO');
}

jQuery(document).ready(function() {
    jQuery("#RoleList").each(updateOption);
    jQuery("#RoleList").change(updateOption);
});

したがって、ドロップドロップから Manager を選択すると ReqiredPhone div が表示され、CEO を選択すると OptionalPhone div が表示されます。

これにより、正しい方向に進むはずです。

検証フィールドでこれをテストしていません。動的に追加する必要がある場合があります。

于 2013-06-26T14:51:39.240 に答える