Как получить значение datafieldtext или selectedtext из списка выбора в asp.net mvc? - PullRequest
0 голосов

Ответы [ 3 ]

2 голосов
/ 20 апреля 2010

Класс ниже использует отражение, чтобы получить текст для выбранного значения в списке. Несколько выбранных элементов списка не поддерживаются.

using System.Web.Mvc;

/// <summary>
/// Provides a set of static methods for getting the text for the selected value within the list.
/// </summary>
public static class SelectListExtensions
{
    /// <summary>
    /// Gets the text for the selected value.
    /// </summary>
    /// <param name="list">The list.</param>
    /// <returns></returns>
    public static string GetSelectedText(this SelectList list)
    {
        foreach(var item in list.Items)
        {
            var dataValuePropertyInfo = item.GetType().GetProperty(list.DataValueField);
            var itemValue = dataValuePropertyInfo.GetValue(item, null);

            if(itemValue != null && itemValue.Equals(list.SelectedValue))
            {
                var textValuePropertyInfo = item.GetType().GetProperty(list.DataTextField);
                return textValuePropertyInfo.GetValue(item, null) as string;
            }
        }

        return null;
    }
}
0 голосов
/ 27 августа 2009

Правильно, если вы строите список в коде и присваиваете каждой опции уникальный идентификатор, тогда вы можете получить этот идентификатор и объединить его с элементом кода и, таким образом, текстом.

Итак,

public class MonthlyItemsFormViewModel
{
  public SelectList Months;
  public string SelectedMonth {get;set;}
}

тогда;

public ActionResult Index()
{
  MonthlyItemsFormViewModel fvm = new MonthlyItemsFormViewModel();
  FillData(fvm, DateTime.Now);
  return View(fvm);
}

А потом;

private void FillData(MonthlyItemsFormViewModel fvm, DateTime SelectedMonth)
{
  List<string> months = DateTime.Now.MonthList(DateTime.Now);
  fvm.Months = new SelectList(months, fvm.SelectedMonth);
}

Тогда, на ваш взгляд;

<% using (Html.BeginForm()) { %>
  <%=Html.DropDownList("selectedMonth", Model.Months) %>
<%} %>

Тогда на пост обратно;

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(FormCollection collection)
{
  MonthlyItemsFormViewModel fvm = new MonthlyItemsFormViewModel();
  UpdateModel(fvm);
  FillData(fvm, DateTime.Parse(DateTime.Now.Year.ToString() + " " + fvm.SelectedMonth + " 01"));
  return View(fvm);
}

В коде поста вы можете взять выбранное значение из fvm, а затем объединить это значение с элементом в вашем списке выбора.

этот код взят непосредственно из моего кода, поэтому, возможно, потребуется изменить его в соответствии с вашей ситуацией.

Имеет ли это смысл?

0 голосов
/ 27 августа 2009

Какой-то код того, что вы пробовали, был бы здесь полезен kurozakura.

В то же время;

Если вы связали свой вид с моделью, вы можете использовать UpdateModel, чтобы вернуть значение.

Итак, если вы связываетесь с классом с именем User, то

User myUser = new User;
TryUpdateModel(myUser);

Если вы не связали его, используйте технику Эдуардо и используйте что-то вроде:

public ActionResult MyViewsAction(FormCollection collection)
{
  string a = collection["selectListCtrlname"];
}
...