Оставьте проблемы в .net с помощью VB и просмотрите модель - PullRequest
1 голос
/ 13 июля 2010

Хорошо, я новичок в .net, я просто делаю снимок в темноте через все это. У меня есть таблица адресов с полями StateID и CountryID. Они ссылаются на таблицу «Состояния и страны». Я использую LINQ to SQL и Visual Studio 2010.

В моем контроллере адресов есть:

    Function Create() As ActionResult
        Dim these_states = GetStates()
        Dim these_countries = GetCountries()
        Dim viewModel = New AddressViewModel(these_states, these_countries)
        Return View(viewModel)
    End Function

    '
    ' POST: /Addresses/Create

    <HttpPost()> _
    Function Create(ByVal this_address As Address) As ActionResult
        dataContext.Addresses.InsertOnSubmit(this_address)
        dataContext.SubmitChanges()
        Return RedirectToAction("Index")
    End Function

Я создал AddressViewModel, и он выглядит так:

Public Class AddressViewModel
Public Address As Address
Private _these_states As System.Linq.IQueryable(Of State)
Private _these_countries As System.Linq.IQueryable(Of Country)

Sub New(ByVal these_states As System.Linq.IQueryable(Of State), ByVal these_countries As System.Linq.IQueryable(Of Country))
    _these_states = these_states
    _these_countries = these_countries
End Sub


Dim StateList As New SelectList(_these_states, "StateID", "Label", 1)
Public Property States As SelectList
    Get
        Return StateList
    End Get
    Set(ByVal value As SelectList)

    End Set
End Property

Dim CountryList As New SelectList(_these_countries, "CountryID", "Label", 1)
Public Property Countries As SelectList
    Get
        Return CountryList
    End Get
    Set(ByVal value As SelectList)
enter code here

Тогда, на мой взгляд, код у меня есть:

    <%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of TotallyAwesomeCRM.AddressViewModel)" %>

некоторый код удален как ненужный

            <div class="editor-label">
                State
            </div>
            <div class="editor-field">
                <%: Html.DropDownList("StateID", Model.States, "1")%>
                <%: Html.ValidationMessageFor(Function(model) model.StateID) %>
            </div>

            <div class="editor-label">
                Country
            </div>
            <div class="editor-field">
                <%: Html.DropDownList("CountryID", Model.Countries, "1")%>
                <%: Html.ValidationMessageFor(Function(model) model.CountryID) %>
            </div>

Поэтому, когда я пытаюсь перейти в Адреса / Создать, я получаю эту ошибку:

ArgumentNullException was not handled by user code:Value cannot be null.

Наименование параметра: items

И это указывает на эту строку в AddressViewModel:

Dim StateList As New SelectList(_these_states, "StateID", "Label", 1)

Я знаю, что это приводит к результатам, поэтому я посмотрел пункт Parameter и msdn сказал, что это System.Collections.IEnumerable

Итак, я изменил AddessViewModel на:

Public Address As Address
Private _these_states As System.Collections.IEnumerable
Private _these_countries As System.Collections.IEnumerable

Sub New(ByVal these_states As System.Collections.IEnumerable, ByVal these_countries As System.Collections.IEnumerable)
    _these_states = these_states
    _these_countries = these_countries
End Sub

Получил ту же ошибку, пожалуйста, помогите

1 Ответ

1 голос
/ 13 июля 2010

Проблема в том, как вы инициализируете StateList и CountryList. Эти значения инициализируются перед вызовом оператора New. Поэтому StateList и CountryList пусты, потому что _these_States и _these_countries пусты.

Измените свой код на это:

Sub New(ByVal these_states As System.Linq.IQueryable(Of State), ByVal these_countries As System.Linq.IQueryable(Of Country))
    _these_states = these_states
    _these_countries = these_countries
End Sub


Dim StateList As SelectList
Public Property States As SelectList
    Get
        If StateList Is Nothing Then
            StateList = New SelectList(_these_states, "StateID", "Label", 1)
        End If
        Return StateList
    End Get
    Set(ByVal value As SelectList)

    End Set
End Property

Dim CountryList As SelectList
Public Property Countries As SelectList
    Get
        If CountryList Is Nothing Then
            CountryList = New SelectList(_these_countries, "CountryID", "Label", 1)
        End If
        Return CountryList
    End Get
    Set(ByVal value As SelectList)
        ' enter code here
    End Set
End Property
...