문제

를 사용하여 템플릿에서 도우미 MVC2.0 로 dillema,을 얻는 방법 항목을 채우기 위해 추가 다운 목록.내가 사용하는 [UIHint(BadgesDropDown)] 특성,하지만 어떻게 됩니까 목록 항을 위반하지 않고 MVC 패턴,해야 합 컨트롤러 곳에서 그들의 viewdata?야 BadgesDropDown.ascx 를 호출하는 도우미을 얻을 수 있습니까?

바로 지금 나는가:

BadgesDropDown.ascx

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%= Html.DropDownList("", ViewData["Badges"] as IEnumerable<SelectListItem>)%>

컨트롤러

ViewData["Badges"] = new SelectList(SiteRepository.GetBadges(), "RowKey", "BadgeName");

이것이 가야하는 방법이 있나요?

도움이 되었습니까?

해결책

MVC 2에서는 훌륭한 새로운 방법입니다 ... 사용하면 모든 속성 데이터에 의존합니다.

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<glossaryDB.EntityClasses.AssociationEntity>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Association: Edit
</asp:Content>

<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
    <h3>Association: Edit</h3>
    <% using (Html.BeginForm()) { %>
        <fieldset style="padding: 1em; margin: 0; border: solid 1px #999;">
            <%= Html.ValidationSummary("Edit was unsuccessful. Please correct the errors and try again.") %>
            <%= Html.EditorForModel() %>
            <input type="submit" value="  Submit  " />
        </fieldset>
    <% } %>
    <p><%= Html.ActionLink("Details", "Index") %></p>
</asp:Content>

이것이 작동하려면 두 가지 옵션이 있습니다. uihint는 데이터 소스를 제공해야하거나 컨트롤러가 있어야합니다. Uihint가 수행하면 드롭 다운에 제공된 데이터가 수정됩니다. 다른 옵션은 컨트롤러이며,이를 통해 REQIRED와 다른 데이터 세트로 드롭 다운 데이터를 전환 할 수 있습니다.

내가 찾은 몇 가지 관련 예가 있습니다.

괴상한 저녁 식사

1;

다른 팁

많은에 대한 논의가 이 항목에서 최근에 있습니다.비슷한 장애가 발생한 날짜,날짜 범위와 다를 선택합 체크 박스 목록이 있습니다.어디서나 사용할 수 있습의 풍부한 html 제어합니다.나는 새로운 개념의 아이 ViewModels 고 나는 생각한 솔루션이기보다는 다른 방법으로 살려냈습니다.

기본적인 개념을 정의하는 작은 볼 모델는 밀접하게 결합하여 사용자 지정 EditorTemplate.

에서 예를 들어,우리는 것으로 시작(아동)뷰 모델는 특정을 하나의 선택 목록:

public class SelectModel
{
  #region SelectModel(string value, IEnumerable<SelectListItem> items)
  public SelectModel(string value, IEnumerable<SelectListItem> items)
  {
    _value = value;
    Items = new List<SelectListItem>(items);

    _Select();
  } 
  #endregion

  // Properties

  public List<SelectListItem> Items { get; private set; }

  public string Value
  { 
    get { return _value; }
    set { _value = value; _Select();}
  }
  private string _value;

  // Methods

  private void _Select()
  {
    Items.ForEach(x => x.Selected = (Value != null && x.Value == Value));
  }
}

에서 보기 모델을 사용하고자하는 드롭다운 당신을 구성을 선택 모델은(우리는 모두 보기 사용 모델,right?):

public class EmailModel
{
  // Constructors

  public EmailModel()
  {
    Priority = new SelectModel("normal", _ToPrioritySelectItems());
  }

  // Properties

  public SelectModel Priority { get; set; }

  // Methods

  private IEnumerable<SelectListItem> _ToPrioritySelectItems()
  {
    List<SelectListItem> result = new List<SelectListItem>();

    result.Add(new SelectListItem() { Text = "High", Value = "high" });
    ...
  }

참고로 이것은 간단한 예제로 고정된 세트의 드롭다운 항목입니다.에서 오고 있다면 도메인 레이어 컨트롤러는 전달합으로 뷰 모델.

그가 편집기 템플릿 SelectModel.ascx 공유/EditorTemplates

<%@ Control Inherits="System.Web.Mvc.ViewUserControl<SelectModel>" %>

<div class="set">
  <%= Html.LabelFor(model => model) %>
  <select id="<%= ViewData.ModelMetadata.PropertyName %>_Value" name="<%=ViewData.ModelMetadata.PropertyName %>.Value">
  <% foreach (var item in Model.Items) { %>
    <%= Html.OptionFor(item) %>
  <% } %>
  </select>
</div>

참고:OptionFor 사용자 정의는 분명

여기서는 id 와 이름이 사용하여 설정 화합물 형식으로 기본 ModelBinder 하고 있습니다.우리의 예에서는"우선 순위입니다.치"입니다.그래서 이 문자열에 따라 값을 속성으로 정의의 일부 SelectModel 이 직접 설정.세터 관리의 목록을 업데이트 항목의 기본값을 설정하려면 옵션을 선택해야 하는 경우 다시 표시합니다.

이"아이는 전망 모형"접근 방식을 정말 빛나는 더 복잡한 제어"조각의 마크업".나는 지금 아이 보는 모델에 따라 유사한 방법을 위해 다중 선택 목록을 시작/종료 날짜 범위,그리고 날짜+시합니다.

로 이동이 경로를 아래로,다음 명백한 질문가 유효성 검사를 수행합니다.

나는 나의 모든 아이 뷰 모델의 구현 표준 인터페이스::

public interface IValidatable
{
  bool HasValue { get; }
  bool IsValid { get; }
}

그 후,나는 사용자 지정 ValidationAttribute:

public class IsValidAttribute : ValidationAttribute
{
  // Constructors

  public IsValidAttribute()
  {
    ErrorMessage = "(not valid)";
  }

  // Properties

  public bool IsRequired { get; set; }

  // Methods

  private bool Is(object value)
  {
    return value != null && !"".Equals(value);
  }

  public override bool IsValid(object value)
  {
    if (!Is(value) && !IsRequired)
      return true;

    if (!(value is IValidatable))
      throw new InvalidOperationException("IsValidAttribute requires underlying property to implement IValidatable");

    IValidatable validatable = value as IValidatable;
    return validatable.IsValid;
  }
}

지금 당신은 당신을 넣을 수 있습에 대한 특성 속성은 아이 뷰 모델과 같은 기반이 어떤 스칼라 객실:

[IsValid(ErrorMessage = "Please enter a valid start date/time")]
public DateAndTimeModel Start { get; set; }

위의 예로 솔루션을 구현했습니다. 주목해야 할 한 가지는 도우미가 제공되는 데이터 만으로만 작동해야한다는 것입니다. 종속성을 봅니다

모범 사례는 컨트롤러와 컨텍스트를 알지 못하는 HTML 도우미를 작성하는 것입니다. 발신자가 제공하는 데이터에 따라 작업을 수행해야합니다.

위의 진술에 동의합니다. 정기적 인 ASP.NET 개발과 비교할 때 많은 작업을 수행해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top