首页 文章

MVC ASP.NET 没有为此对象定义的无参数构造函数

提问于
浏览
3

当我单击“提交”以创建帐户时,将显示以下错误。我无法找到它为什么会出现以下错误。我也尝试使用断点和调试,但它没用

没有为此对象定义的无参数构造函数。

描述:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.MissingMethodException:没有为此对象定义无参数构造函数。

来源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常的起源和位置的信息。

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">
            
<b>@Html.LabelFor(model => model.Name)</b> </div> <div class="editor-field"> @Html.EditorFor(model => model.Name) </div> <div class="editor-label">
<b> @Html.LabelFor(model => model.UserName)</b> </div> <div class="editor-field"> @Html.EditorFor(model => model.UserName) </div> <div class="editor-label">
<b> @Html.Label("Account From")</b> </div> <div class="editor-field"> @Html.DropDownListFor(model => model.accountFrom, (SelectList)ViewBag.AccountFromList) </div> <div class="editor-label">
<b> @Html.LabelFor(model => model.AvailableBalance)</b> </div> <div class="editor-field"> @Html.EditorFor(model => model.AvailableBalance) </div> <div class="editor-label">
<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">
<b> @Html.LabelFor(model => model.Description)</b> </div> <div class="editor-field"> @Html.EditorFor(model => model.Description) </div> <div class="editor-label">
<b> @Html.LabelFor(model => model.DateOpened)</b> </div> <div class="editor-field"> @Html.EditorFor(model => model.DateOpened) </div> <div class="editor-label">
<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">
<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);

        }

2 回答

  • 9

    这是因为您的 ViewModel 类中没有无参数构造函数。那里有 2 个构造函数:

    • public NewFixedAccountViewModel(string username)

    • public NewFixedAccountViewModel(int accountID,string username)

    当您提交表单时,在模型绑定期间,控制器正在尝试创建模型的新实例,但它找不到无参数构造函数。

    所以你需要:

    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);
    
        }
    
  • 0

    我不确定这是否正确,但我认为发生的事情是你已经为你的模型声明了构造函数。所以它试图根据你的模型类创建一个新对象,但不能,因为没有一个构造函数不接受任何参数。我认为您需要做的是使用您定义的构造函数在控制器中创建一个新模型并将其传递给视图:

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

    然后它将绑定到您使用适当的构造函数创建的模型对象,并将表单字段绑定到该对象,而不是尝试创建新的。

相关问题