MVC ASP.NET Для этого объекта не определен конструктор без параметров.

Когда я нажимаю кнопку «Отправить», чтобы создать учетную запись, отображается следующая ошибка. Я не могу понять, почему возникает следующая ошибка. Также я пытался использовать точки останова и отладку, но это было бесполезно

Для этого объекта не определен конструктор без параметров.

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

Сведения об исключении: System.MissingMethodException: для этого объекта не определен конструктор без параметров.

Ошибка источника:

Необработанное исключение было создано во время выполнения текущего веб-запроса. Информацию о происхождении и местонахождении исключения можно определить с помощью трассировки стека исключений ниже.

AccountController.cs

    [HandleError]
        public ActionResult CreateNewFixedBankAccount()
        {
            ViewBag.AccountFromList = new SelectList(
           ManageAccount.Instance.GetAccounts(), "accountID", "name");
            ViewBag.AccountTypes = new SelectList(ManageAccountType.Instance.GetNonFixedTypes(), "id", "type");
            ViewBag.Durations = new SelectList(ManageDuration.Instance.GetAllDurations(), "id", "duration1");


            ViewBag.Currencies = new SelectList(ManageCurrency.Instance.getCurrencies(), "id", "symbol");
            return View();


        }

        //
        // POST: /Account/CreateNewFixedBankAccount
        [HttpPost]
        [HandleError]
        public ActionResult CreateNewFixedBankAccount(ViewModel.NewAccountViewModel model, string username)
        {

            return View();
        }

___________________________________________________________________________________________

CreateNewFixedBankAccount.cshtml. При нажатии на кнопку отправки ниже отображается ошибка.

    @model internetBankingApplication.ViewModel.NewFixedAccountViewModel    
    @{
        ViewBag.Title = "CreateNewFixedBankAccount";
    }


    @using (Html.BeginForm())
    {

        ViewBag.Title = "Create";
        Layout = "~/Views/Shared/_Layout.cshtml";
        <fieldset>
            <legend>Fixed Account Details</legend>

            <div class="editor-label">
            <br />
     <b>@Html.LabelFor(model => model.Name)</b>
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Name)
            </div>

            <div class="editor-label">
            <br />
                <b> @Html.LabelFor(model => model.UserName)</b>
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.UserName)
            </div>

            <div class="editor-label">
            <br />
             <b> @Html.Label("Account From")</b>
            </div>
            <div class="editor-field">
                 @Html.DropDownListFor(model => model.accountFrom, (SelectList)ViewBag.AccountFromList)
            </div>

            <div class="editor-label">
            <br />
               <b>  @Html.LabelFor(model => model.AvailableBalance)</b>
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.AvailableBalance)
            </div>


            <div class="editor-label">
            <br />
     <b>@Html.LabelFor(model => model.currency)</b>
            </div>
            <div class="editor-field">
                 @Html.DropDownListFor(model => model.currency, (SelectList)ViewBag.Currencies)
            </div>

            <div class="editor-label">
            <br />
               <b>  @Html.LabelFor(model => model.Description)</b>
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.Description)
            </div>

            <div class="editor-label">
            <br />
                <b> @Html.LabelFor(model => model.DateOpened)</b>
            </div>
            <div class="editor-field">
                @Html.EditorFor(model => model.DateOpened)
            </div>


            <div class="editor-label">
            <br />
             <b> @Html.Label("Account Duration")</b>
            </div>
            <div class="editor-field">
                 @Html.DropDownListFor(model => model.duration, (SelectList)ViewBag.Durations)
                 &nbsp;
                  @Html.ActionLink("View Duration Details","DurationDetails","Duration")
            </div>


            <div class="editor-label">
            <br />
             <b> @Html.Label("Account Renew")</b>
            </div>
            <div class="editor-field">
                 @Html.CheckBoxFor(model => model.renew)

            </div>


            <p>
                <input type="submit" value="CreateNewFixedBankAccount" /></p>
        </fieldset>
    }



___________________________________________________________________________________________

NewFixedAccountViewModel.cs

Эта модель представления будет получать сведения, относящиеся к учетной записи, из разных таблиц в базе данных.

    public class NewFixedAccountViewModel
    {
        private account _Account { get; set; }

        private fixedAccount _FixedAccount { get; set; }

        private int AccountFrom { get; set; }

        public SelectList AccountTypes { get; set; }

        public SelectList Durations { get; set; }

        public SelectList AccountFromList { get; set; }

        public SelectList Currencies { get; set; }

        public int ID
        {
            get
            {
                return _Account.accountID;
            }
        }

        [Required]
        [Display(Name = "Account Name")]
        public string Name
        {
            get
            {
                return _Account.name;
            }
            set
            {
                _Account.name = value;
            }
        }

        [Required]
        [Display(Name = "Account From")]
        public int accountFrom
        {
            get
            {
                return accountFrom;
            }
            set
            {
                accountFrom = value;
            }
        }

        public string AccountFromName
        {
            get
            {
                string result = string.Empty;
                try
                {
                    result = ManageAccount.Instance.GetAccountBYID(accountFrom).name;
                }
                catch { }
                return result;
            }
        }


        [Required]
        [Display(Name = "Account Type")]
        public int typeID
        {
            get
            {
                return _Account.typeID;
            }
            set
            {
                _Account.typeID = value;
            }
        }

        public string AccountTypeName
        {
            get
            {
                string result = string.Empty;
                try
                {
                    result = ManageAccountType.Instance.getTypesByID(_Account.typeID).type;
                }
                catch { }
                return result;
            }
        }


        [Required]
        [Display(Name = "Duration")]
        public int duration
        {
            get
            {
                return _FixedAccount.duration;
            }
            set
            {
                _FixedAccount.duration = value;
            }
        }

        public string durationName
        {
            get
            {
                string result = string.Empty;
                try
                {
                    result = ManageDuration.Instance.GetDurationById(_FixedAccount.duration).duration1;
                }
                catch { }
                return result;
            }
        }

        [Required]
        [Display(Name = "Available Balance")]
        public decimal AvailableBalance
        {
            get
            {
                return _Account.availableBalance;
            }
            set
            {
                _Account.availableBalance = value;
            }
        }

        [Required]
        [Display(Name = "Currency")]
        public int currency
        {
            get
            {
                return _Account.currency;
            }
            set
            {
                _Account.currency = value;
            }
        }

        public string CurrencyName
        {
            get
            {
                string result = string.Empty;
                try
                {
                    result = ManageCurrency.Instance.getTypesByID(_Account.currency).name;
                }
                catch { }
                return result;
            }
        }


        [Required]
        [Display(Name = "Account Description")]
        public string Description
        {
            get
            {
                return _Account.description;
            }
            set
            {
                _Account.description = value;
            }
        }


        [Required]
        [Display(Name = "Account Renew")]
        public bool renew
        {
            get
            {
                if (_FixedAccount.renew == 0)
                {
                    return false;
                }
                return true;
            }
            set
            {
                if (value == false)
                {
                    _FixedAccount.renew = 0;
                }
                else
                {

                    _FixedAccount.renew = 1;
                }
            }
        }


        [Required]
        [Display(Name = "Date Opened")]
        public DateTime DateOpened
        {
            get
            {
                return _Account.dateOpened;
            }
            set
            {
                _Account.dateOpened = value;
            }
        }

        [Required]
        [Display(Name = "Username")]
        public string UserName
        {
            get
            {
                return _Account.username;
            }
            set
            {
                _Account.username = value;
            }
        }

        public NewFixedAccountViewModel(string username)
        {
            AccountTypes = new SelectList(
            ManageAccountType.Instance.getTypes(), "id", "type", _Account.typeID);


            AccountFromList = new SelectList(
            ManageAccount.Instance.GetUserAccounts(username), "accountID", "name", accountFrom);

            Currencies = new SelectList(
            ManageCurrency.Instance.getCurrencies(), "id", "name", _Account.currency);

            Durations = new SelectList(
            ManageDuration.Instance.GetAllDurations(), "id", "duration", _FixedAccount.duration);


        }

        public NewFixedAccountViewModel(int accountID, string username)
        {
            _Account = ManageAccount.Instance.GetAccountBYID(accountID);

            _FixedAccount = ManageFixedAccount.Instance.GetFixedAccountByID(accountID);

            AccountFromList = new SelectList(
            ManageAccount.Instance.GetUserAccounts(username), "accountID", "name", accountFrom);

            AccountTypes = new SelectList(
            ManageAccountType.Instance.getTypes(), "id", "type", _Account.accountType);

            Currencies = new SelectList(
            ManageCurrency.Instance.getCurrencies(), "id", "name", _Account.currency);

            Durations = new SelectList(
            ManageDuration.Instance.GetAllDurations(), "id", "duration", _FixedAccount.duration);


        }

person Anna Marie Rapa    schedule 01.05.2013    source источник
comment
Вы публикуете NewFixedAccountViewModel, но ваше мнение привязано к NewFixedAccountViewModel. Возможно, вы захотите сначала изучить это.   -  person von v.    schedule 01.05.2013
comment
Он означает, что ваше действие CreateNewFixedBankAccount принимает NewAccountViewModel и ваше представление имеет модель, объявленную как NewFixedAccountViewModel.   -  person wellers    schedule 01.05.2013
comment
Возможно, вам потребуется проверить, что все параметры вашей модели, которые вы передаете обратно из представления при обратной передаче, имеют как «геттеры», так и «сеттеры», чтобы гарантировать, что модель может быть связана резервным копированием.   -  person wellers    schedule 01.05.2013
comment
да, я изменил это, но это все еще дает мне ошибку: /   -  person Anna Marie Rapa    schedule 01.05.2013


Ответы (2)


это потому, что в вашем классе ViewModel нет конструктора без параметров. У вас там 2 конструктора:

  • общедоступный NewFixedAccountViewModel (строковое имя пользователя)
  • общедоступный NewFixedAccountViewModel (int accountID, строковое имя пользователя)

Когда вы отправляете форму, во время привязки модели контроллер пытается создать новый экземпляр модели, но не находит конструктор без параметров.

Итак, вам необходимо иметь:

public NewFixedAccountViewModel() { 
// Your code here 
}

Что вы можете сделать, так это использовать свойство Username вместо параметра username, поэтому ваш код будет:

public NewFixedAccountViewModel()
    {
        AccountTypes = new SelectList(
        ManageAccountType.Instance.getTypes(), "id", "type", _Account.typeID);


        AccountFromList = new SelectList(
        ManageAccount.Instance.GetUserAccounts(Username), "accountID", "name", accountFrom);

        Currencies = new SelectList(
        ManageCurrency.Instance.getCurrencies(), "id", "name", _Account.currency);

        Durations = new SelectList(
        ManageDuration.Instance.GetAllDurations(), "id", "duration", _FixedAccount.duration);

    }
person Adelia Benalius    schedule 01.05.2013
comment
Вы сохраняете вошедшее в систему имя пользователя в сеансе или другом объекте? - person Adelia Benalius; 01.05.2013
comment
Когда я это сделал, при нажатии кнопки ничего не происходит -_- - person Anna Marie Rapa; 01.05.2013
comment
Он даже не делает постбэк? Если я правильно понимаю, этот конструктор заполняет свойства списка выбора, верно? И вам нужно имя пользователя для получения связанных учетных записей. Я не знаю, как проходит ваша аутентификация, но, возможно, вы можете взять имя пользователя из сеанса или из User.Identity.Name - person Adelia Benalius; 01.05.2013
comment
Знаете ли вы, возможно, почему методы получения и установки accountFrom выполняют цикл infinate и выдают мне следующую ошибку, пожалуйста? Необработанное исключение типа System.StackOverflowException произошло в internetBankingApplication.dll - person Anna Marie Rapa; 01.05.2013
comment
Потому что вы присваиваете значение одному и тому же свойству. Поэтому, когда вы устанавливаете значение accountFrom, оно передается в сеттер. Но внутри установщика вы снова делаете accountFrom = value. Что снова запускает сеттер и так далее. - person Adelia Benalius; 01.05.2013
comment
Вы можете просто написать публичный int accountFrom {get; набор; } - person Adelia Benalius; 01.05.2013
comment
Нет .. Мне нужно получить значение, выбранное из модели просмотра - person Anna Marie Rapa; 01.05.2013
comment
Значение по-прежнему будет установлено с использованием этого метода. Просто .net автоматически управляет хранением значения. См. stackoverflow.com/questions/61480/ - person Adelia Benalius; 01.05.2013
comment
но он используется для отображения, чтобы получить выбранное значение из раскрывающегося списка - person Anna Marie Rapa; 01.05.2013
comment
:) я понял! THX .. ПРОСТО НЕСКОЛЬКО ОШИБОК СЛЕВА - person Anna Marie Rapa; 01.05.2013
comment
знаете ли вы, почему Currencies = new SelectList (ManageCurrency.Instance.getCurrencies (), id, name, _Account.currency); дает мне эту ошибку? pls Ссылка на объект не установлена ​​на экземпляр объекта. - person Anna Marie Rapa; 01.05.2013

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

NewFixedAccountViewModel model = new NewFixedAccountViewModel(username);
return View(model);

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

person ssn771    schedule 01.05.2013
comment
Теперь это дает мне еще одну ошибку в ссылке на объект списка выбора, не установленной для экземпляра объекта. - person Anna Marie Rapa; 01.05.2013