programing

MVC의 컨트롤러에서 DropDownList SelectedValue를 가져오는 방법

showcode 2023. 6. 14. 21:59
반응형

MVC의 컨트롤러에서 DropDownList SelectedValue를 가져오는 방법

데이터베이스에서 작성한 드롭다운 목록이 있습니다.이제 Controller에서 선택한 값을 조작해야 합니다.하지만 이해가 안 됩니다.내가 시도한 코드.

모델

public class MobileViewModel 
{          
    public List<tbInsertMobile> MobileList;
    public SelectList Vendor { get; set; }
}

컨트롤러

 public ActionResult ShowAllMobileDetails()
    {
        MobileViewModel MV = new MobileViewModel();
        MV.MobileList = db.Usp_InsertUpdateDelete(null, "", "", null, "", 4, MergeOption.AppendOnly).ToList();
        MV.Vendor = new SelectList(db.Usp_VendorList(), "VendorId", "VendorName");
        return View(MV);
    }

    [HttpPost]
    public ActionResult ShowAllMobileDetails(MobileViewModel MV)
    {           
        string strDDLValue = ""; // Here i need the dropdownlist value

        return View(MV);
    }

보다

   <table>           
        <tr>
            <td>Mobile Manufacured</td>
            <td>@Html.DropDownList("ddlVendor", Model.Vendor, "Select Manufacurer") </td>
        </tr>         
        <tr>
            <td>

            </td>
            <td>
                <input id="Submit1" type="submit" value="search" />
            </td>
        </tr>
    </table>

첫 번째 접근 방식(요청 또는 양식 수집을 통해)

다있니습에서 읽을 수 .Request용사를 Request.Form은 당의드운이름은다입니다.ddlVendor지나갑니다ddlVendorCollection 양식을 입력하여 양식별로 게시된 값을 가져옵니다.

string strDDLValue = Request.Form["ddlVendor"].ToString();

또는 사용FormCollection:

[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV,FormCollection form)
{           
  string strDDLValue = form["ddlVendor"].ToString();

  return View(MV);
}

두 번째 접근 방식(모델을 통해):

모델 바인딩을 사용하려면 모델에 속성을 추가합니다.

public class MobileViewModel 
{          
    public List<tbInsertMobile> MobileList;
    public SelectList Vendor { get; set; }
    public string SelectedVendor {get;set;}
}

및 보기:

@Html.DropDownListFor(m=>m.SelectedVendor , Model.Vendor, "Select Manufacurer")

실행 중:

[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV)
{           
   string SelectedValue = MV.SelectedVendor;
   return View(MV);
}

업데이트:

선택한 항목의 텍스트도 게시하려면 숨김 필드를 추가하고 드롭다운 선택 시 선택한 항목 텍스트를 숨김 필드에 설정해야 합니다.

public class MobileViewModel 
{          
    public List<tbInsertMobile> MobileList;
    public SelectList Vendor { get; set; }
    public string SelectVendor {get;set;}
    public string SelectedvendorText { get; set; }
}

jquery를 사용하여 숨겨진 필드를 설정합니다.

<script type="text/javascript">
$(function(){
$("#SelectedVendor").on("change", function {
   $("#SelectedvendorText").val($(this).text());
 });
});
</script>

@Html.DropDownListFor(m=>m.SelectedVendor , Model.Vendor, "Select Manufacurer")
@Html.HiddenFor(m=>m.SelectedvendorText)

모델

성별 필드가 있는 매우 기본적인 모델입니다. GetGenderSelectItems()DropDownList를 채우는 데 필요한 선택 항목을 반환합니다.

public enum Gender 
{
    Male, Female
}

public class MyModel
{
    public Gender Gender { get; set; }

    public static IEnumerable<SelectListItem> GetGenderSelectItems()
    {
        yield return new SelectListItem { Text = "Male", Value = "Male" };
        yield return new SelectListItem { Text = "Female", Value = "Female" };
    }
}

보다

포장했는지 확인해 주세요.@Html.DropDownListFor서식표로

@model MyModel

@using (Html.BeginForm("MyController", "MyAction", FormMethod.Post)
{
   @Html.DropDownListFor(m => m.Gender, MyModel.GetGenderSelectItems())
   <input type="submit" value="Send" />
}

컨트롤러

.cshtml 레이저 뷰 이름은 컨트롤러 작업 이름과 동일해야 하며 폴더 이름은 컨트롤러 이름과 일치해야 합니다.Views\MyController\MyAction.cshtml.

public class MyController : Controller 
{
    public ActionResult MyAction()
    {
        // shows your form when you load the page
        return View();
    }

    [HttpPost]
    public ActionResult MyAction(MyModel model)
    {
        // the value is received in the controller.
        var selectedGender = model.Gender;
        return View(model);
    }
}

더 나아가기

이제 강력한 유형과 열거형을 독립적으로 만들어 보겠습니다.

var genderSelectItems = Enum.GetValues(typeof(Gender))
    .Cast<string>()
    .Select(genderString => new SelectListItem 
    {
        Text = genderString,
        Value = genderString,
    }).AsEnumerable();

MVC 5/6/레이저 페이지

뷰백은 이미 너무 남용되고 있기 때문에 강력한 타입의 모델이 가장 좋은 방법이라고 생각합니다 :)

MVC 5 예

사용자의 Get Action

public async Task<ActionResult> Register()
    {
        var model = new RegistrationViewModel
        {
            Roles = GetRoles()
        };

        return View(model);
    }

사용자 뷰 모델

    public class RegistrationViewModel
    {
        public string Name { get; set; }

        public int? RoleId { get; set; }

        public List<SelectListItem> Roles { get; set; }
    }    

사용자 보기

    <div class="form-group">
        @Html.LabelFor(model => model.RoleId, htmlAttributes: new { @class = "col-form-label" })
        <div class="col-form-txt">
            @Html.DropDownListFor(model => model.RoleId, Model.Roles, "--Select Role--", new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.RoleId, "", new { @class = "text-danger" })
        </div>
    </div>                                   

사용자의 사후 조치

    [HttpPost, ValidateAntiForgeryToken]
    public async Task<ActionResult> Register(RegistrationViewModel model)
    {
        if (ModelState.IsValid)
        {
            var _roleId = model.RoleId, 

MVC 6 조금 다를 거예요.

작업 가져오기

public async Task<ActionResult> Register()
    {
        var _roles = new List<SelectListItem>();
        _roles.Add(new SelectListItem
        {
           Text = "Select",
           Value = ""
        });
        foreach (var role in GetRoles())
        {
          _roles.Add(new SelectListItem
          {
            Text = z.Name,
            Value = z.Id
          });
        }

        var model = new RegistrationViewModel
        {
            Roles = _roles
        };

        return View(model);
    }

View 모델은 MVC 5와 동일합니다.

당신의 견해는 다음과 같습니다.

<select asp-for="RoleId" asp-items="Model.Roles"></select>

게시물도 동일합니다.

레이저 페이지

페이지 모델

[BindProperty]
public int User User { get; set; } = 1;

public List<SelectListItem> Roles { get; set; }

public void OnGet()
{
    Roles = new List<SelectListItem> {
        new SelectListItem { Value = "1", Text = "X" },
        new SelectListItem { Value = "2", Text = "Y" },
        new SelectListItem { Value = "3", Text = "Z" },
   };
}

<select asp-for="User" asp-items="Model.Roles">
    <option value="">Select Role</option>
</select>

누군가에게 도움이 되길 바랍니다 :)

당신이 경우용을 사용하고 .@Html.DropDownList팔로우.

컨트롤러:

var categoryList = context.Categories.Select(c => c.CategoryName).ToList();

ViewBag.CategoryList = categoryList;

보기:

@Html.DropDownList("Category", new SelectList(ViewBag.CategoryList), "Choose Category", new { @class = "form-control" })

$("#Category").on("change", function () {
 var q = $("#Category").val();

console.log("val = " + q);
});

당신이 가벼운 것을 찾는다면, 당신의 행동에 매개변수를 추가하겠습니다.

[HttpPost]
public ActionResult ShowAllMobileDetails(MobileViewModel MV, string ddlVendor)
{           
    string strDDLValue = ddlVendor; // Of course, this becomes silly.

    return View(MV);
}

있는첫 를 현재코는발 "ddlVendor"로 입니다.Html.DropDownList그리고 그것은 MVC 프레임워크에게 다음과 같은 것을 만들라고.<select> 원소name"ddlVendor"는 다음과 같습니다사용자가 양식을 클라이언트 측에 제출하면 해당 키에 대한 값이 포함됩니다.

가 을 MVC로 분석하려고 할 때 " " " " " " "MV그것은 찾을 것입니다.MobileList그리고.Vendor둘 다 찾지 못해서 채워지지 않을 겁니다이 매개 변수를 추가하거나 사용하여FormCollection다른 답변에서 제안한 것처럼 MVC가 해당 이름의 양식 요소를 구체적으로 검색하여 매개 변수 값을 게시된 값으로 채울 것을 요청하는 것입니다.

SelectList를 사용하여 @HtmlDropdownListFor를 바인딩하고 여기에 selectedValue 매개 변수를 지정합니다.

http://msdn.microsoft.com/en-us/library/dd492553(v=vs.108).aspx

예: 벤더 ID를 얻기 위해 이렇게 할 수 있습니다.

@Html.DropDownListFor(m => m.VendorId,Model.Vendor)


   public class MobileViewModel 
   {          
    public List<tbInsertMobile> MobileList;
    public SelectList Vendor { get; set; }
    public int VenderID{get;set;}
   }
   [HttpPost]
   public ActionResult Action(MobileViewModel model)
   {
            var Id = model.VenderID;

저는 ASP에서도 같은 문제를 겪고 있었습니다.NET 면도기 C#

나는.ComboBox의 직함으로 가득 찬.EventMessage그리고 선택한 값으로 이 메시지의 내용을 표시하여 레이블 또는TextField기타Control...

나의ComboBox다음과 같이 채워졌습니다.

 @Html.DropDownList("EventBerichten", new SelectList(ViewBag.EventBerichten, "EventBerichtenID", "Titel"), new { @class = "form-control", onchange = "$(this.form).submit();" })

내 안에서EventController페이지로 이동할 수 있는 기능이 있었는데, 거기서 나는 나의 것을 보여주고 싶었습니다.ComboBox(모델 유형이 다르기 때문에 부분 뷰를 사용해야 했습니다.)

부분 보기를 로드할 인덱스에서 페이지로 가져오는 기능:

  public ActionResult EventDetail(int id)
        {

            Event eventOrg = db.Event.Include(s => s.Files).SingleOrDefault(s => s.EventID == id);
            //  EventOrg eventOrg = db.EventOrgs.Find(id);
            if (eventOrg == null)
            {

                return HttpNotFound();
            }
            ViewBag.EventBerichten = GetEventBerichtenLijst(id);
            ViewBag.eventOrg = eventOrg;
            return View(eventOrg);
        }

부분 보기 기능은 다음과 같습니다.

 public PartialViewResult InhoudByIdPartial(int id)
        {
            return PartialView(
                db.EventBericht.Where(r => r.EventID == id).ToList());

        }

EventBerichten을 채우는 기능:

        public List<EventBerichten> GetEventBerichtenLijst(int id)
        {
            var eventLijst = db.EventBericht.ToList();
            var berLijst = new List<EventBerichten>();
            foreach (var ber in eventLijst)
            {
                if (ber.EventID == id )
                {
                    berLijst.Add(ber);
                }
            }
            return berLijst;
        }

부분 뷰 모델은 다음과 같습니다.

@model  IEnumerable<STUVF_back_end.Models.EventBerichten>

<table>
    <tr>
        <th>
            EventID
        </th>
        <th>
            Titel
        </th>
        <th>
            Inhoud
        </th>
        <th>
            BerichtDatum
        </th>
        <th>
            BerichtTijd
        </th>

    </tr>

    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.EventID)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Titel)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Inhoud)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.BerichtDatum)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.BerichtTijd)
            </td>

        </tr>
    }
</table>

VIEUW: 이 스크립트는 뷰에서 내 출력을 가져오는 데 사용됩니다.

<script type="text/javascript">
    $(document).ready(function () {
        $("#EventBerichten").change(function () {
            $("#log").ajaxError(function (event, jqxhr, settings, exception) {
                alert(exception);
            });

            var BerichtSelected = $("select option:selected").first().text();
            $.get('@Url.Action("InhoudByIdPartial")',
                { EventBerichtID: BerichtSelected }, function (data) {
                    $("#target").html(data);
                });
        });
    });
            </script>
@{
                    Html.RenderAction("InhoudByIdPartial", Model.EventID);
                } 

<fieldset>
                <legend>Berichten over dit Evenement</legend>
                <div>
                    @Html.DropDownList("EventBerichten", new SelectList(ViewBag.EventBerichten, "EventBerichtenID", "Titel"), new { @class = "form-control", onchange = "$(this.form).submit();" })
                </div>

                <br />
                <div id="target">

                </div>
                <div id="log">

                </div>
            </fieldset>

감사합니다. 이것은 제가 가진 문제를 더 잘 이해하고 해결하는 데 도움이 되었습니다.선택한 텍스트를 가져오기 위해 제공된 JQuery아이템이 작동하지 않았습니다.

$(function () {
  $("#SelectedVender").on("change", function () {
   $("#SelectedvendorText").val($(**"#SelectedVender option:selected"**).text());
  });
});

간단한 해결책은 이것이 제안되었는지 여부를 확신할 수 없습니다.또한 일부 경우에는 작동하지 않을 수도 있습니다.이것이 아래의 간단한 해결책이라고 합니다.

new SelectListItem { Value = "1", Text = "Waiting Invoices", Selected = true}

List<SelectListItem> InvoiceStatusDD = new List<SelectListItem>();
InvoiceStatusDD.Add(new SelectListItem { Value = "0", Text = "All Invoices" });
InvoiceStatusDD.Add(new SelectListItem { Value = "1", Text = "Waiting Invoices", Selected = true});
InvoiceStatusDD.Add(new SelectListItem { Value = "7", Text = "Client Approved Invoices" });

@Html.DropDownList("InvoiceStatus", InvoiceStatusDD)

데이터베이스 기반 선택 목록에 대해서도 이와 같은 작업을 수행할 수 있습니다.컨트롤러에서 선택한 항목을 설정해야 합니다.

@Html.DropDownList("ApprovalProfile", (IEnumerable<SelectListItem>)ViewData["ApprovalProfiles"], "All Employees")

이와 유사하지만 더 나은 솔루션이 존재합니다. 이것은 하나의 방법일 뿐입니다.

foreach (CountryModel item in CountryModel.GetCountryList())
    {
        if (item.CountryPhoneCode.Trim() != "974")
        {
            countries.Add(new SelectListItem { Text = item.CountryName + " +(" + item.CountryPhoneCode + ")", Value = item.CountryPhoneCode });

        }
        else {


            countries.Add(new SelectListItem { Text = item.CountryName + " +(" + item.CountryPhoneCode + ")", Value = item.CountryPhoneCode,Selected=true });

        }
    }

언급URL : https://stackoverflow.com/questions/27901175/how-to-get-dropdownlist-selectedvalue-in-controller-in-mvc

반응형