为什么在模型绑定中单选列表会转换为多选列表?

时间:2019-12-20 18:37:31

标签: asp.net-core asp.net-core-mvc asp.net-core-2.0

我试图在视图模型中将多个单个选择列表绑定到一个字符串列表,我具有属性:public List<string> Items {get; set;},并且在我的视图中,我具有3个带有单个选择选项的选择列表,但是当我尝试时使用asp-for="@Model.Items"模型将我的选择列表绑定到Items属性,我所有的单个选择列表都会转换为多选择列表。为什么?

我的观点:

<form asp-controller="Admin" asp-action="Index" method="post">
    <div class="col-12">
        <div class="row">
            <div class="form-group col-4">
                <div class="d-inline-block">
                    <label>Order By Price:</label>
                </div>
                <div class="d-inline-block">
                    <select class="form-control" asp-for="@Model.Items" style="width:150px">
                        <option value="Ascending">Ascending</option>
                        <option value="Descending">Descending</option>
                    </select>
                </div>

            </div>
            <div class="form-group col-4">
                <div class="d-inline-block">
                    <label>Order By Name:</label>
                </div>
                <div class="d-inline-block">
                    <select class="form-control" asp-for="@Model.Items"  style="width:150px">
                        <option value="A-Z">A-Z</option>
                        <option value="Z-A">Z-A</option>
                    </select>
                </div>
            </div>
            <div class="form-group">
                <div class="d-inline-block">
                    <button type="submit" class="btn btn-secondary">Confirm</button>
                </div>
            </div>
        </div>
    </div>
</form>

控制器:

[HttpPost]
        public IActionResult Index(MangeProductsViewModel vm)
        {
            return View(new MangeProductsViewModel
            {
                Products = productRepository.Products.ToList().SortProducts(vm)
            });
        }

我的视图模型

public IEnumerable<Product> Products { get; set; }
public List<string> Items { get; set; }

当我从列表中选择项目时,它可以正确添加它们,问题是dat用户可以从一个列表中选择多个选项

3 个答案:

答案 0 :(得分:0)

这是因为 import android.annotation.SuppressLint; import android.content.Intent; import android.gesture.GestureOverlayView; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toolbar; import androidx.annotation.NonNull; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.multidex.MultiDex; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import com.example.shrinkio.Fragments.HomeFragment; import com.example.shrinkio.Fragments.MessagesFragment; import com.example.shrinkio.Fragments.NotFragment; import com.example.shrinkio.Fragments.PeopleFragment; import com.example.shrinkio.R; import com.example.shrinkio.SecondaryActivities.DrawerLayout; import com.example.shrinkio.SecondaryActivities.PostActivity; import com.example.shrinkio.SecondaryActivities.Posts; import com.example.shrinkio.SecondaryActivities.ProfileActivity; import com.example.shrinkio.SecondaryActivities.SettingsActivity; import com.firebase.ui.database.FirebaseRecyclerAdapter; import com.firebase.ui.database.FirebaseRecyclerOptions; import com.google.android.material.bottomnavigation.BottomNavigationView; import com.google.android.material.navigation.NavigationView; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.google.firebase.database.Query; import com.google.firebase.storage.StorageReference; import java.util.Objects; import static com.example.shrinkio.R.menu.main_menu; public class BottomActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { RadioGroup radioGroup; RadioButton Rd1, Rd2, Rd3, Rd4; RecyclerView rv; private ActionBar actionBar; private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mDrawerToggle; private StorageReference StorageRef; private Toolbar toolbar; private DatabaseReference mDataBase; @SuppressLint({"RtlHardcoded", "ClickableViewAccessibility"}) @Override protected void onCreate(Bundle savedInstanceState) { MultiDex.install(this); super.onCreate( savedInstanceState ); setContentView( R.layout.activity_bottom ); new GestureOverlayView( this ); //Action bar configurations Objects.requireNonNull( getSupportActionBar() ).setDisplayOptions( ActionBar.DISPLAY_SHOW_CUSTOM); getSupportActionBar().setCustomView( R.layout.abs_layout_home ); //Navigation view NavigationView nav_view; nav_view = findViewById(R.id.nav_view); //select nav_view from activity_drawer_layout nav_view.setNavigationItemSelectedListener(this); View nav_header = nav_view.getHeaderView(0); rv = findViewById(R.id.recyclerView); rv.setHasFixedSize(true); rv.setLayoutManager(new LinearLayoutManager(this)); mDataBase = FirebaseDatabase.getInstance().getReference().child("Posts"); //Navigation Drawer header menu items on click actions LinearLayout header = nav_header.findViewById( R.id.nav_header); header.setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { startActivity( new Intent( BottomActivity.this, ProfileActivity.class ) ); } } ); BottomNavigationView bottomNav = findViewById(R.id.bottom_navigation); bottomNav.setOnNavigationItemSelectedListener(navListener); //I added this if statement to keep the selected fragment when rotating the device if (savedInstanceState == null) { getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, new HomeFragment()).commit(); } } @Override protected void onStart() { super.onStart(); FirebaseRecyclerOptions<Posts> options = new FirebaseRecyclerOptions.Builder<Posts>() .setQuery(mDataBase, Posts.class) .build(); FirebaseRecyclerAdapter firebaseRecyclerAdapter = new FirebaseRecyclerAdapter <Posts, PostViewHolder> ( Posts.class, R.layout.posts, PostViewHolder.class, mDataBase ) { @Override protected void onBindViewHolder(@NonNull PostViewHolder holder, int position, Posts model) { holder.setPost(model.getPost()); } @NonNull @Override public PostViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.posts, parent, false); return new PostViewHolder(view); } }; rv.setAdapter(firebaseRecyclerAdapter); } public static class PostViewHolder extends RecyclerView.ViewHolder{ View mview; public PostViewHolder(@NonNull View itemView) { super(itemView); mview = itemView; } public void setPost(String post) { TextView post_title = mview.findViewById(R.id.post); post_title.setText(post); } } //Define the options menu @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(main_menu, menu); return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { { if (item.getItemId() == R.id.add){ startActivity(new Intent(this, PostActivity.class)); } } return super.onOptionsItemSelected(item); } // Bottom Navigation View, when the fragment is selected private BottomNavigationView.OnNavigationItemSelectedListener navListener = new BottomNavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Fragment selectedFragment = null; switch (item.getItemId()) { case R.id.navigation_home: selectedFragment = new HomeFragment(); break; case R.id.navigation_dashboard: selectedFragment = new NotFragment(); break; case R.id.navigation_people: selectedFragment = new PeopleFragment(); break; case R.id.navigation_messages: selectedFragment = new MessagesFragment(); } getSupportFragmentManager().beginTransaction().replace(R.id.fragment_container, selectedFragment).commit(); return true; } }; // Navigation menu items on click action @Override public boolean onNavigationItemSelected (@NonNull MenuItem item){ switch (item.getItemId()) { case R.id.nav_profile: startActivity( new Intent( BottomActivity.this, ProfileActivity.class ) ); overridePendingTransition( 0, 0 ); return true; case R.id.nav_settings: startActivity( new Intent( BottomActivity.this, SettingsActivity.class ) ); overridePendingTransition( 0, 0 ); return true; default: return super.onOptionsItemSelected( item ); } } @Override public void onBackPressed() { super.onBackPressed(); } } 调用了标记帮助程序,并且对于类型为asp-for的prop,所生成的HTML将是选择倍数。但是,这对您无论如何都不起作用,因为它将为所有选择提供相同的名称。结果,它们只会相互覆盖,而不会彼此相加。

为此,您将不得不通过以下方式手动处理事情:

List<string>

对于每个下拉列表。

答案 1 :(得分:0)

尝试一下!

在您的HttpGet方法中创建一个长度为3的新列表,并将其分配给模型的Items属性,并将模型传递给视图。

在视图中,如下编写as-for

  

asp-for =“ @ Model.Items [0]”

     

asp-for =“ @ Model.Items [1]”

     

asp-for =“ @ Model.Items [2]”

答案 2 :(得分:0)

原因是您使用过fun justGreater(nums: IntArray, pivotIndex: Int): Int { var result = 0 var currBest = Int.MAX_VALUE for (i in pivotIndex until nums.size) { if (nums[i] > nums[pivotIndex] && nums[i] < currBest) { result = i currBest = nums[i] } } return result } ,因为您的项目是asp-for="@Model.Items"的类型,所以下拉列表设置为多选。

只需使用List<string>

name="Items"

结果:

enter image description here