DropdownList дает нулевое значение для модели вызова контроллера - PullRequest
0 голосов
/ 24 сентября 2019

Я студент-разработчик в ASP.NET.У меня есть вопрос, который я не нашел решения по этому поводу.Я могу построить форму для моего контроллера.Я беру значение из моих входных объектов, но я не беру значение из выпадающего списка на мой контроллер.Это дает нулевое значение на моем контроллере.Не могли бы вы помочь мне, где я допустил ошибку?

My View Модель:

public class CountryViewModel
{
    public IEnumerable<Country> CountryList { get; set; }
    public Country Country;
}

Мой контроллер:

 public ActionResult Index()
    {

        var model = new CountryViewModel()
        {
            CountryList = db.Country.ToList()
        };
        return View(model);
    }
    [HttpPost]
    public ActionResult Index(string timeForCheckedOut,CountryViewModel cvModel)
    {

        return View();
    }

my index.cshtml:

   @model PenaltyCalculation.Models.ViewModel.CountryViewModel

<form class="" style="margin-top:10%;" action="/" method="post">
    <div class="form-group">
        <label>Check out date of the Book</label>
        <input class="form-control" type="date" name="timeForCheckedOut">
    </div>
    <div class="form-group">
        <label>Choose a country</label>
        @Html.DropDownListFor(m=>m.Country.countryId,new SelectList(Model.CountryList,"countryId","countryName"),new {@class="form-control" })
    </div>
    <button type="submit" class="btn btn-primary">Calculate</button>
</form>

Модель моей страны:

 public partial class Country
    {
        public int countryId { get; set; }
        public string countryName { get; set; }          
    }

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Вариант № 1:

Вам просто нужно поставить {get;установлен;} в конце Country в вашей CountryViewModel.Это позволит вам установить значение countryId, но имя не будет установлено.Вам нужно будет отыскать это по сравнению с вашей базой данных, если вам это тоже нужно.

public class CountryViewModel
{
    public IEnumerable<Country> CountryList { get; set; }
    public Country Country { get; set; }
}

Option # 2

Это то, что я бы сделал.Переделайте вашу CountryViewModel, чтобы фактически представить модель вашего представления.

public class CountryViewModel
{
    public int CountryID { get; set; }
    public DateTime TimeForCheckedOut { get; set; }
}

Затем обновите ваш контроллер.

    // Simulating a db
    private List<Country> Countries;

    public HomeController()
    {
        // Initializing sample data
        Countries = new List<Country>();

        Countries.Add(new Country() { countryId = 1, countryName = "USA" });
        Countries.Add(new Country() { countryId = 2, countryName = "England" });
        Countries.Add(new Country() { countryId = 3, countryName = "Japan" });
        Countries.Add(new Country() { countryId = 4, countryName = "China" });
    }

    public ActionResult Index()
    {
        // I prefer using the ViewData Dictionary for my selectlists
        ViewData["CountrySelectList"] = new SelectList(Countries, "countryId", "countryName");

        return View();
    }

    [HttpPost]
    public ActionResult Index(CountryViewModel cvModel)
    {
        var country = Countries.First(c => c.countryId == cvModel.CountryId);
        // Do Stuff Like Saving and Updating

        ViewData["CountrySelectList"] = new SelectList(Countries, "countryId", "countryName", cvModel.CountryId);
        return View(cvModel);
    }

И, наконец, обновите ваш View

@model PenaltyCalculation.Models.ViewModel.CountryViewModel

<form class="" style="margin-top:10%;" action="/" method="post">
    <div class="form-group">
        <label>Check out date of the Book</label>
        <input class="form-control" type="date" name="timeForCheckedOut">
    </div>
    <div class="form-group">
        <label>Choose a country</label>

        @Html.DropDownListFor(m => m.CountryId, (SelectList)ViewBag.CountrySelectList, new { @class = "form-control" })
    </div>
    <button type="submit" class="btn btn-primary">Calculate</button>
</form>
0 голосов
/ 24 сентября 2019
public class CountryController : Controller
{
    // GET: Country
    public ActionResult Index()
    {
        var model = new CountryViewModel()
        {
            CountryList = GetCountries()
        };

        return View(model);
    }

    [HttpPost]
    public ActionResult Index(CountryViewModel model)
    {
        model.CountryList = GetCountries();
        return View(model);
    }

    private IEnumerable<Country> GetCountries()
    {
        return new Country[]
            {
                new Country()
                {
                    CountryID = 1,
                    CountryName = "USA"
                },
                new Country()
                {
                    CountryID = 2,
                    CountryName = "Mexico"
                },
            };
    }
}

public class CountryViewModel
{
    public IEnumerable<Country> CountryList { get; set; }
    public int CountryID { get; set; }
    public DateTime? TimeForCheckedOut { get; set; }
}

public partial class Country
{
    public int CountryID { get; set; }
    public string CountryName { get; set; }
}

<form class="" style="margin-top:10%;" action="/Country/Index" method="post">
    <div class="form-group">
        <label>Check out date of the Book</label>
        <input class="form-control" type="date" name="TimeForCheckedOut">
    </div>
    <div class="form-group">
        <label>Choose a country</label>
        @Html.DropDownListFor(m => m.CountryID, new SelectList(Model.CountryList, "CountryID", "CountryName"), new { @class = "form-control" })        
    </div>
    <button type="submit" class="btn btn-primary">Calculate</button>
</form>

Это работает для меня

Убедитесь, что CountryID имеет геттер и сеттер.Также в C # имя публичного свойства начинается с заглавной буквы (по соглашению)

Я бы также посоветовал не связывать Country сущность напрямую для просмотра.Вы можете создать CountryModel

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...