yogesh vaidya Ответов: 1

Выпадающий список не показывают, сведения в частичный вид в ASP.NET в MVC 5 на 2017


я новичок в этом деле. asp.net и пытаясь создать форму информации о клиенте ,теперь в custController я успешно создаю список стран и в качестве параметра ContryID я хочу создать public actionResult Getstate, но это не должно работать

Что я уже пробовал:

в custController

public List<Country> GetCountries() {
         List<Country> countries = dc.Countries.ToList();
         return countries;
     }

     public ActionResult GetState(int CountryID) {
          List<State_list> states = dc.State_list.Where(x => x.CountryID == CountryID).ToList();
          ViewBag.stList = new SelectList(states, "StatelistID", "STATE", "CountryID");

         return PartialView("DisplayState");

     }
     [HttpGet]
     public ActionResult Create() {

         ViewBag.ContList = new SelectList(GetCountries(), "CountryID", "CountryName");
         return View();
     }
 }



В
PartialView("DisplayState")


@model ChaBuss.Models.State_list
	<option value="">-- Select States --</option>
@if (ViewBag.stList != null) {
	foreach (var item in ViewBag.stList) {

		<option value="@item.value">@item.text</option>
	}
}



в режиме HTML

@model ChaBuss.Models.Customer

@{
	ViewBag.Title = "Create";
}

<h4 style="font:300;color:#0026ff">Create New Customer </h4>
<html>
<head>




</head>
<body>
	<form actions="#">
		<div class="form-horizontal">
			<hr />
			@Html.ValidationSummary(true, "", new { @class = "text-danger" })
			<div class="form-group">

				<label class="control-label">Customer name </label>   
				@*	@Html.LabelFor(model => model.Customer_Name, htmlAttributes: new { @class = "control-label col-md-2" })*@
				<div colspan="3">
					@Html.EditorFor(model => model.Customer_Name, new { htmlAttributes = new { @class = "form-control" } })
					@Html.ValidationMessageFor(model => model.Customer_Name, "", new { @class = "text-danger" })
				</div>
			</div>
			<div class="form-group">
				<label class="control-label">Customer Address </label>
				<div colspan="3">
					@Html.TextAreaFor(model => model.CustomerAddress, new { htmlAttributes = new { @class = "form-control" } })
					@Html.ValidationMessageFor(model => model.CustomerAddress, "", new { @class = "text-danger" })

				</div>
			</div>
			<div class="dtr-details">
				<table class="table table-responsive table-bordered">
					<tr style="background-color:palegoldenrod">

						<td>Contry </td>
						<td>state </td>
						<td>City</td>
						<td>Pin Code</td>
						<td> </td>
					</tr>
					<tr class="mycontainer" id="mainrow">
						<td>
							<div>
								@Html.DropDownListFor(m => m.CountryID, ViewBag.ContList as SelectList, "-- Select Contry --", new { @class = "form-control" })
								@Html.ValidationMessageFor(model => model.Contry, "", new { @class = "text-danger" })
							</div>
						</td>


						<td>
							<div>
								@Html.DropDownListFor(m => m.StatelistID, new SelectList(" ViewBag.stList"), "-- Select Contry --", new { @class = "form-control" })
								@Html.ValidationMessageFor(model => model.StatelistID, "", new { @class = "text-danger" })
							</div>
						</td>
					</tr>
				</table>
			</div>
		</div>
	</form>
</body>
</html>
@section Scripts{
     <script src="~/Scripts/jquery-1.10.2.min.js"></script>
	<script >
		$(document).ready(function () {
			$("#CountryID").change(function () {
				var contId = $(this).val();
				debugger
				$.ajax({
					type: "post",
					url: "/Cust/GetState?CountryID=" + contId,
					contentType: "html",
					success: function (response) {
						debugger
						$("#StatelistID").empty();
						$("#StatelistID").append(response);
					}
				})  
			})
		})
	</script>
}

F-ES Sitecore

"Не работает" не дает никому достаточно информации, чтобы помочь решить проблему. Используйте отладчик и сетевые инструменты, чтобы увидеть, вызывается ли ваше действие. Одна из возможных проблем заключается в том, что Ваш url-адрес - "/Cust/GetState", который будет работать только в том случае, если ваш сайт находится в корне, чего мы не знаем. Используйте Url.Action для построения параметра url-адреса, чтобы убедиться, что он действителен, а не жестко кодировать его.

http://www.rubencanton.com/blog/2013/04/requesting-to-c-mvc-net-using-jquery-ajax.html

Проблема может быть и во многих других вещах, вы не можете просто сбросить груз кода и ожидать, что другие люди решат проблемы, научатся использовать доступные инструменты отладки, чтобы по крайней мере лучше понять, как далеко ваш код заходит, прежде чем он перестанет делать то, что вы хотите.

yogesh vaidya

спасибо сэр,
я попробовал с шагом debug , сначала он ждал на @section Scripts ,а затем запустил js scripts 3.3.1 там сначала он показывает url - Cust/ GetState и Contryid, а затем он пошел к контроллеру в методе Acction GetState, а затем он перешел на страницу PartialView и через ошибку Microsoft.Используется CSharp.RuntimeBinder.RuntimeBinderException: "System.Web.Mvc.SelectListItem' не содержит определения для 'value' ,


на странице PartialView когда я открываю цикл foreach когда я ставлю мышь на элемент это show i singel и first record ,

1 Ответов

Рейтинг:
6

F-ES Sitecore

Проблема в вашем коде в том виде, как он был опубликован, заключается в том, что ваше частичное представление повторяется через SelectList, поэтому "элемент" будет SelectListItem. Затем вы получаете доступ к "значению" и "тексту"

<option value="@item.value">@item.text</option>


Однако правильными свойствами являются "значение" и "текст", а c# чувствителен к регистру, поэтому вам нужно изменить свое представление на

<option value="@item.Value">@item.Text</option>


Одна из проблем с использованием ViewBag заключается в том, что вы не знаете, какие типы находятся в вашем представлении, поэтому VS не может помочь вам, когда вы делаете что-то неправильно. Вам лучше отказаться от viewbag и использовать типизированные модели, а также перестать использовать SelectList, поскольку он в основном используется для рендеринга списка в представлении, в то время как вы создаете html вручную в представлении. Если вы хотите придерживаться своего списка выбора, то измените свой взгляд следующим образом;

@model System.Web.Mvc.SelectList
<option value="">-- Select States --</option>
@if (Model != null)
{
    foreach (var item in Model)
    {
        <option value="@item.Value">@item.Text</option>
    }
}


Теперь VS знает, что такое тип "элемент", и позволяет вам использовать intellisense, а также сообщает вам, если вы используете неправильные свойства. Теперь смените контроллер;

public ActionResult GetState(int CountryID)
{
    List<State_list> states = GetStateList().Where(x => x.CountryID == CountryID).ToList();
    SelectList stList = new SelectList(states, "StatelistID", "STATE", "CountryID");

    // pass the model to the view in the second parameter
    return PartialView("DisplayState", stList);
}


Вы можете улучшить это еще больше, полностью избавившись от списка выбора. Вид;

@model List<ChaBuss.Models.State_list>
<option value="">-- Select States --</option>
@if (Model != null)
{
    foreach (var item in Model)
    {
        <option value="@item.StatelistID">@item.STATE</option>
    }
}


Контроллер;

public ActionResult GetState(int CountryID)
{
    List<State_list> states = GetStateList().Where(x => x.CountryID == CountryID).ToList();

    // pass the model to the view in the second parameter
    return PartialView("DisplayState", states);
}