Не удается получить доступ к значению правильно выпадающий список asp mvc - PullRequest
0 голосов
/ 22 февраля 2019

Я новичок в asp mvc, поэтому я пытался понять, как получить выбранное значение из выпадающего списка.Теперь я хочу видеть выбранное значение в виде текста в моем представлении.После поиска нескольких примеров у меня есть этот код в контроллере:

public ActionResult Index()
        {
        TaskModel task = new TaskModel();
        task.Tasks = FillTaskList();          
        return View(task);
    }

    [HttpPost]
    public ActionResult Index(TaskModel task)
    {
        task.Tasks = FillTaskList();
        ViewBag.Message = task.TaskName;
        return View(task);
    }

    private static List<SelectListItem> FillTaskList()
    {
        List<SelectListItem> items = new List<SelectListItem>();
        string constr = ConfigurationManager.ConnectionStrings["contingentConnectionString"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            string query = " SELECT TaskId, TaskName FROM Task";
            using (SqlCommand cmd = new SqlCommand(query))
            {
                cmd.Connection = con;
                con.Open();
                using (SqlDataReader sdr = cmd.ExecuteReader())
                {
                    while (sdr.Read())
                    {
                        items.Add(new SelectListItem
                        {
                            Text = sdr["TaskName"].ToString(),
                            Value = sdr["TaskId"].ToString()
                        });
                    }
                }
                con.Close();
            }
        }
        return items;
    }

Это мой взгляд:

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

@model WebApplication1.Models.TaskModel

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
</head>
<body>
    <div>    
        @using (Html.BeginForm("Index", "Home", FormMethod.Post))
        {
            <div class="form-group">
                @Html.DropDownListFor(m => m.TaskId, Model.Tasks, "--Select task--", null)
            </div>
            <button type="Submit" class="btn btn-success submit">Send</button><br/>
            <span style="color:green">@Html.Raw(ViewBag.Message)</span>
        }        
    </div>
</body>
</html>

И это моя модель:

namespace WebApplication1.Models
{
    public class TaskModel
    {
        public List<SelectListItem> Tasks { get; set; }
        public int TaskId { get; set; }
        public string TaskName { get; set; }
    }
}

Проблема в том, что я продолжаю получать значение NULL вместо значения «TaskName»,

ViewBag.Message = task.TaskName;

, но

ViewBag.Message = task.TaskId;

обрабатывается правильно, и я вижу его в ViewBag.Message.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Ваша проблема: в вашем действии POST, он только отображает TaskId из выпадающего списка, вам нужен фильтр в TaskList, чтобы проверить выбранную задачу в списке.Если в списке выбрано задание, установите ViewBag.Message = selectedTask.Text

. Вам необходимо обновить код действия для POST:

[HttpPost]
 public ActionResult Index(TaskModel task)
 {
            task.Tasks = FillTaskList();
            var selectedTask = task.Tasks.FirstOrDefault(c => c.Value == task.TaskId.ToString());
            if (selectedTask != null)
            {
                ViewBag.Message = selectedTask.Text;
            }

            return View(task);
 }
0 голосов
/ 23 февраля 2019

Используйте метод Html.HiddenFor Helper, чтобы создать скрытую переменную в форме для этого свойства.

@Html.HiddenFor(x => x.TaskName)

Используйте javascript для установки выделенного текста

$(function () {
  $("form").submit(function(){
    var selText = $("#TaskId option:selected").text();
    $("#TaskName").val(selText);           
  });
});

Тогда в контроллере вы можете получить

string value = model.TaskName;
...