Как заполнить выпадающие значения с использованием данных Cosmos DB на странице регистрации C # MVC? - PullRequest
1 голос
/ 16 мая 2019

Я пытаюсь отобразить выпадающий список с помощью Azure Cosmos db в форме страницы регистрации. Но это ничего не показывает. Я новичок в C # MVC

Я создал отдельную модель Customer для получения данных клиента из Azure. Передал его для просмотра с использованием Tempdata. Но это просто показывает слово «CustomerName» в выпадающем списке. Пожалуйста, помогите, я новичок в C #

namespace WebApplication1.Models
{

    public class Customer
    {

        [JsonProperty(PropertyName = "id")]
        public string Id { get; set; }


        [JsonProperty(PropertyName = "Name")]
        public string Name { get; set; }

        [JsonProperty(PropertyName = "GroupId")]
        public int GroupId { get; set; }

    }
  }   


public class RegisterViewModel
    {
        [Required]
        [EmailAddress]
        [Display(Name = "Email")]
        public string Email { get; set; }

        [Required]
        [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
        [DataType(DataType.Password)]
        [Display(Name = "Password")]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
        public string ConfirmPassword { get; set; }

        [Required]
        [Display(Name = "GroupId")]
        public int GroupId { get; set; }

        public Customer CustomerName { get; set; }
           }


public async Task<ActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                var user = new ApplicationUser { UserName = model.Email, Email = model.Email, GroupId = model.GroupId};
                var item = await DocumentDBRepository<Customer>.GetCustomerAsync(d => d.Id != null);
               TempData["item"] = item.ToList();
                ViewBag.Id = item.Select(d =>d.GroupId);
                ViewBag.Name = item.Select(d => d.Name);

                var result = await UserManager.CreateAsync(user, model.Password);
                if (result.Succeeded)
                {
                    await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

                    string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);
                    var callbackUrl = Url.Action("ConfirmEmail", "Account",
                       new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);
                    await UserManager.SendEmailAsync(user.Id,
                       "Confirm your account", "Please confirm your account by clicking <a href=\""
                       + callbackUrl + "\">here</a>");

                    return RedirectToAction("Landing", "Device");
                }
                AddErrors(result);
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }





@model WebApplication1.Models.RegisterViewModel
@using WebApplication1.Models;
@using System;
@{
    ViewBag.Title = "Register";
}

<h2>@ViewBag.Title.</h2>

@{
    var customerdata = (IEnumerable<Customer>)TempData["Customer"];
}

@using (Html.BeginForm("Register", "Account", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Create a new account.</h4>
    <hr />
    @Html.ValidationSummary("", new { @class = "text-danger" })

    <div class="form-group">

        <div class="col-md-10">
            @Html.DropDownList("CustomerName", new SelectList(nameof(Model.CustomerName)), new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Email, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.Email, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.Password, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.Password, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.ConfirmPassword, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.PasswordFor(m => m.ConfirmPassword, new { @class = "form-control" })
        </div>
    </div>
    <div class="form-group">
        @Html.LabelFor(m => m.GroupId, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            @Html.TextBoxFor(m => m.GroupId, new { @class = "form-control" })
        </div>
    </div>


    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" class="btn btn-default" value="Register" />
        </div>
    </div>
}

Я не получаю никаких ошибок. Но и не получить желаемого результата. В раскрывающемся списке отображаются буквы написания "CustomerName". Где мне нужны имена клиентов в выпадающем списке.

1 Ответ

0 голосов
/ 16 мая 2019

Вместо того, чтобы использовать Tempdata, используйте viewbag для привязки deopdownlist

Вот код, который выбирает данные из объекта item и конвертирует их в List<SelectListItem>

var item = await DocumentDBRepository<Customer>.GetCustomerAsync(d => d.Id != null);
               TempData["item"] = item.ToList();
                ViewBag.Id = item.Select(d =>d.GroupId);
                ViewBag.Name = item.Select(d => d.Name);

                List<SelectListItem> ddlcustomer = (from c in item
                        select new SelectListItem
                        {
                            Text = c.Name,
                            Value = c.GroupId,
                        }).ToList();

                        ViewBag.ddlcustomer = ddlcustomer;

Просмотр страницы

@Html.DropDownListFor("CustomerName", ViewBag.ddlcustomer as SelectList, new { @class = "form-control" })

Я бы настоятельно рекомендовал использовать dropdown для передачи модели из контроллера

  @Html.DropDownListFor(model=>model.CustomerName.GroupId, ViewBag.ddlcustomer as SelectList, new { @class = "form-control" })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...