คำถามติดแท็ก asp.net-mvc

ASP.NET MVC Framework เป็นเฟรมเวิร์กแอปพลิเคชันเว็บของ Microsoft ที่ใช้รูปแบบ model-view-controller (MVC)

2
สุดยอดโอเพ่นซอร์ส ASP.NET MVC โครงการอีคอมเมิร์ซ [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ฉันต้องทำให้ไซต์อีคอมเมิร์ซทำงานได้ แต่ฉันไม่ต้องการตั้งโปรแกรมจากล่างขึ้นบนหากไม่จำเป็น ฉันต้องการโปรแกรมโดยใช้ ASP.NET MVC ฉันกำลังมองหาทางเลือกโอเพนซอร์ซที่ดี (หรืออีกอันสำหรับการซื้อหากเป็นแบบแยกส่วน) ที่ฉันสามารถใช้เป็นฐานและปรับปรุงด้วยฟังก์ชั่นที่จำเป็น? มันต้องมีฟังก์ชั่นอีคอมเมิร์ซ "ปกติ" ทั้งหมดและยังมีความเป็นไปได้ที่จะรวมกับ API บัตรเครดิตที่ฉันเลือก หากใครมีคำแนะนำสำหรับฉันที่นี่ฉันจะขอบคุณมัน :)

5
Pure Front End JavaScript พร้อม Web API กับ MVC views ด้วย ajax
นี่เป็นการถกเถียงกันมากขึ้นว่าวันนี้ประชาชนคิดอย่างไรกับการแยกเว็บแอพพลิเคชั่น ฉันคุ้นเคยกับการสร้างแอปพลิเคชัน MVC ด้วยมุมมองและตัวควบคุมทั้งหมด ปกติแล้วฉันจะสร้างมุมมองแบบเต็มและส่งผ่านสิ่งนี้กลับไปยังเบราว์เซอร์บนคำขอเต็มหน้าเว้นแต่จะมีพื้นที่เฉพาะที่ฉันไม่ต้องการให้ปรากฏทันทีและจะใช้กิจกรรมโหลดหน้า DOM เพื่อเรียกเซิร์ฟเวอร์เพื่อโหลดพื้นที่อื่น ใช้ AJAX นอกจากนี้เมื่อมีการรีเฟรชหน้าบางส่วนฉันจะเรียกวิธีการดำเนินการ MVC ซึ่งจะคืนค่าส่วนย่อย HTML ซึ่งฉันสามารถใช้เพื่อเติมข้อมูลบางส่วนของหน้า นี่จะเป็นพื้นที่ที่ฉันไม่ต้องการชะลอการโหลดหน้าเริ่มต้นหรือพื้นที่ที่เหมาะกับการโทร AJAX ตัวอย่างหนึ่งจะใช้สำหรับเพจจิ้งตาราง หากคุณต้องการไปยังหน้าถัดไปฉันจะชอบถ้าการโทร AJAX ได้รับข้อมูลนั้นแทนที่จะใช้การรีเฟรชหน้าเต็ม แต่การโทร AJAX จะยังคงส่งคืน HTML ส่วน คำถามของฉันคือ ความคิดของฉันเกี่ยวกับโบราณนี้เพราะฉันมาจากพื้นหลัง. net มากกว่าพื้นหลังส่วนหน้าบริสุทธิ์หรือไม่ นักพัฒนาส่วนหน้าอัจฉริยะที่ฉันทำงานด้วยชอบทำอะไรมากหรือน้อยในมุมมอง MVC และอยากทำทุกอย่างที่ส่วนหน้า ขวาไปที่การโทรผ่านเว็บ API เพื่อใส่ข้อมูลในหน้า ดังนั้นแทนที่จะเรียกวิธีการดำเนินการ MVC ซึ่งส่งคืน HTML เขาต้องการที่จะส่งคืนวัตถุมาตรฐานและใช้จาวาสคริปต์เพื่อสร้างองค์ประกอบทั้งหมดของหน้า วิธีการพัฒนาส่วนหน้าหมายความว่าคุณจะได้รับประโยชน์ใด ๆ ที่ฉันได้รับจากการตรวจสอบรุ่นของ MVC รวมถึงการตรวจสอบด้านลูกค้า นอกจากนี้ยังหมายความว่าคุณจะได้รับประโยชน์ใด ๆ จากการสร้างมุมมองด้วยเทมเพลต html ที่พิมพ์อย่างมากและจะหายไป …

4
วิธีนี้ฉันเขียนโค้ดนี้สามารถทดสอบได้ แต่มีอะไรผิดปกติกับฉันหรือเปล่า
IContextฉันมีอินเตอร์เฟซที่เรียกว่า สำหรับวัตถุประสงค์นี้ไม่สำคัญว่าจะทำอะไรยกเว้นดังต่อไปนี้: T GetService<T>(); สิ่งที่วิธีนี้ทำคือดูที่ DI คอนเทนเนอร์ปัจจุบันของแอ็พพลิเคชันและพยายามแก้ไขการพึ่งพา ฉันคิดว่าค่อนข้างมาตรฐาน ในแอปพลิเคชัน ASP.NET MVC ของฉันคอนสตรัคของฉันมีลักษณะเช่นนี้ protected MyControllerBase(IContext ctx) { TheContext = ctx; SomeService = ctx.GetService<ISomeService>(); AnotherService = ctx.GetService<IAnotherService>(); } ดังนั้นแทนที่จะเพิ่มหลายพารามิเตอร์ในตัวสร้างสำหรับแต่ละบริการ (เพราะจะทำให้รำคาญและใช้เวลานานสำหรับนักพัฒนาที่ขยายแอปพลิเคชัน) ฉันใช้วิธีนี้เพื่อรับบริการ ตอนนี้ก็รู้สึกผิด แต่วิธีการที่ฉันกำลังเหตุผลมันอยู่ในหัวของฉันนี้ - ฉันจะเยาะเย้ยมัน ฉันสามารถ. IContextการทดสอบตัวควบคุมนั้นคงไม่ยาก ฉันจะต้องต่อไป: public class MyMockContext : IContext { public T GetService<T>() { if (typeof(T) == typeof(ISomeService)) …

2
"ตรรกะการนำเสนอ" คืออะไรและยอมรับได้ในมุมมองเท่าใด
ในเว็บแอปพลิเคชันของฉันฉันต้องจัดเตรียมแบบฟอร์มสำหรับการสร้างและแก้ไข แบบฟอร์มสำหรับการสร้างและการแก้ไขมีความแตกต่างเล็กน้อยดังนั้นฉันจึงคิดที่จะทำสิ่งนี้ในมุมมองของฉัน: <form> // a lot of htnl goes here @if (editing) { // some more fields shown in edit mode } @if(!editing) { // some stuff shown in create mode } ฉันพยายามไม่ใส่ifข้อความใด ๆในมุมมองของฉัน แต่ครั้งนี้ฉันไม่เห็นตัวเลือกอื่นนอกจากคัดลอกส่วนใหญ่ของ HTML ในสองแห่งซึ่งฉันไม่ต้องการทำ นี่เป็น "ตรรกะการนำเสนอ" ที่เหมาะสมหรือไม่และมีตัวเลือกอื่น ๆ อีกหรือไม่

5
วิธีแก้ไขปัญหาการอ้างอิงแบบวงกลมด้วย JSON และ Entity
ฉันได้ทำการทดลองกับการสร้างเว็บไซต์ที่ใช้ประโยชน์จาก MVC กับ JSON สำหรับเลเยอร์งานนำเสนอและกรอบงานเอนทิตีสำหรับโมเดลข้อมูล / ฐานข้อมูล ปัญหาของฉันมาพร้อมกับการทำให้วัตถุโมเดลของฉันเป็นอนุกรมลงใน JSON ฉันใช้รหัสวิธีแรกในการสร้างฐานข้อมูลของฉัน เมื่อทำโค้ดวิธีแรกความสัมพันธ์แบบหนึ่งต่อหลายคน (parent / child) ต้องการให้เด็กมีการอ้างอิงกลับไปที่ parent (รหัสตัวอย่างของฉันเป็นตัวพิมพ์ผิด แต่คุณได้รับรูปภาพ) class parent { public List<child> Children{get;set;} public int Id{get;set;} } class child { public int ParentId{get;set;} [ForeignKey("ParentId")] public parent MyParent{get;set;} public string name{get;set;} } เมื่อส่งคืนวัตถุ "พาเรนต์" ผ่าน JsonResult ข้อผิดพลาดการอ้างอิงแบบวงกลมจะถูกส่งออกไปเนื่องจาก "child" มีคุณสมบัติของคลาสพาเรนต์ ฉันได้ลองใช้ …

4
มันเป็น "รูปแบบกลิ่น" ที่จะนำตัวแบบเช่น "FullName" หรือ "FormattedPhoneNumber" ในรุ่นของคุณหรือไม่?
ฉันกำลังทำงานกับแอพ ASP.NET MVC และฉันเริ่มติดนิสัยในการวางสิ่งที่ดูเหมือนว่า getters ที่เป็นประโยชน์และสะดวกในคลาส / โมเดลเอนทิตีของฉัน ตัวอย่างเช่น: public class Member { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string PhoneNumber { get; set; } public string FullName { get { return FirstName + …

3
IValidatableObject vs Single Responsibility
ฉันชอบจุดที่เพิ่มความสามารถของ MVC ช่วยให้มุมมองแบบจำลองใช้ IValidatableObject และเพิ่มการตรวจสอบความถูกต้องที่กำหนดเอง ฉันพยายามควบคุมให้ตัวควบคุมของฉันคงอยู่เพราะการใช้รหัสนี้เป็นเพียงตรรกะการตรวจสอบเท่านั้น: if (!ModelState.IsValid) return View(loginViewModel); ตัวอย่างเช่นโมเดลมุมมองล็อกอินใช้ IValidatableObject รับวัตถุ ILoginValidator ผ่านการสร้างคอนสตรัค: public interface ILoginValidator { bool UserExists(string email); bool IsLoginValid(string userName, string password); } ดูเหมือนว่า Ninject การฉีดอินสแตนซ์ในมุมมองแบบจำลองไม่ใช่วิธีปฏิบัติทั่วไปจริง ๆ อาจเป็นรูปแบบการต่อต้านหรือไม่ นี่เป็นวิธีที่ดีหรือไม่? มีดีกว่าไหม

3
คำถามเกี่ยวกับการออกแบบการปรับใช้หน้าปัจจุบัน
ฉันได้ตรวจสอบการแบ่งหน้าใน asp.net mvc โดยเฉพาะและฉันรู้สึกว่ามีบางสิ่งบางอย่างที่มีประสิทธิภาพน้อยกว่าในการใช้งาน ประการแรกการใช้งานทั้งหมดใช้ค่าเลขหน้าดังนี้ public ActionResult MostPopulars(int pageIndex,int pageSize) { } สิ่งที่ฉันรู้สึกผิดคือ pageIndex และ pageSize ทั้งหมดควรเป็นสมาชิกของคลาส Pagination มิฉะนั้นวิธีนี้จะดูมีประโยชน์มาก นอกจากนี้ยังช่วยลดความยุ่งยากของพารามิเตอร์ที่ไม่จำเป็นในการใช้งาน สิ่งที่สองคือพวกเขาใช้ด้านล่างส่วนต่อประสาน public interface IPagedList<T> : IList<T> { int PageCount { get; } int TotalItemCount { get; } int PageIndex { get; } int PageNumber { get; } int PageSize { …

5
กลับไปที่ ASP.Net Webforms จาก ASP.Net MVC แนะนำรูปแบบ / สถาปัตยกรรม?
สำหรับคุณหลายคนสิ่งนี้จะดูเหมือนคำถามที่ไร้สาระ แต่ฉันถามเพราะฉันไม่มีประสบการณ์กับ ASP.Net Webforms เพียงเล็กน้อย - ฉันไปที่ ASP.Net MVC โดยตรง ตอนนี้ฉันกำลังทำงานในโครงการที่เรา จำกัด . Net 2.0 และ Visual Studio 2005 ฉันชอบการแยกข้อกังวลอย่างชัดเจนเมื่อทำงานกับ ASP.Net MVC และฉันกำลังมองหาบางอย่างที่จะทำให้เว็บฟอร์มทนไม่ได้ มีรูปแบบหรือแนวทางปฏิบัติที่แนะนำสำหรับผู้ที่ชื่นชอบ asp.net MVC แต่ติดอยู่ใน. net 2.0 และ visual studio 2005 หรือไม่?

1
ตัวควบคุม Async ใน ASP.NET MVC: ข้อดีจริง / เป็นอย่างไร
ฉันทำงานผ่านบทความเกี่ยวกับวิธีการควบคุมแบบอะซิงโครนัสใน ASP.NET MVC ( http://visualstudiomagazine.com/articles/2013/07/23/async-actions-in-aspnet-mvc-4.aspx ) และฉันคิดว่า ฉันอาจจะพลาดจุดนี้ ลองใช้วิธีนี้ที่ฉันเขียนซึ่งคล้ายกับตัวอย่างจากบทความ: [HttpGet] [AsyncTimeout(8000)] [HandleError(ExceptionType = typeof(TimeoutException), View = "TimedOut")] public async Task<ActionResult> Index(CancellationToken cancellationToken) { WidgetPageViewModel model = new WidgetPageViewModel() { toAdd = new Widget() }; model.all = await _repo.GetAllAsync(cancellationToken); return View(model); } เมื่อฉันเข้าใจสิ่งต่าง ๆ นี่คือสิ่งที่จะเกิดขึ้นในรันไทม์: เธรด ASP.NET จะถูกสร้างขึ้นสำหรับคำขอ HTTP ขาเข้า หัวข้อนี้จะ …

1
การแยก ASP.NET IdentityUser จากเอนทิตีอื่นของฉัน
ฉันมีProjectName.Coreห้องสมุดที่มีตรรกะทางธุรกิจของฉันและหน่วยงานของฉันและพฤติกรรมของพวกเขา ขณะนี้ไม่มีความสัมพันธ์ใด ๆ กับ Entity Framework หรือ DAL อื่นใดเพราะฉันต้องการแยกสิ่งเหล่านั้นออกจากกัน การกำหนดค่า Entity Framework (ใช้ Fluent API) อยู่ในProjectName.Infrastructureโครงการเพื่อดูแลผลักดันเอนทิตีของฉันไปที่ EF โดยทั่วไปฉันจะไปในทิศทางของสถาปัตยกรรมที่คล้ายกับหัวหอม อย่างไรก็ตามเมื่อเพิ่มกรอบงาน ASP.NET Identity ลงในการผสมฉันต้องทำให้ApplicationUserเอนทิตีของฉันสืบทอดจากIdentityUserคลาส แต่ApplicationUserคลาสของฉันมีความสัมพันธ์กับเอนทิตีอื่น ในการสืบทอดจากIdentityUserฉันแนะนำการอ้างอิงถึง Entity Framework ในโครงการเอนทิตีของฉันที่เดียวที่ฉันไม่ต้องการทำ การดึงApplicationUserคลาสออกจากโครงการเอนทิตีและเข้าสู่Infrastructureโครงการ (เนื่องจากใช้ระบบเอกลักษณ์ของ Entity Framework) จะส่งผลให้มีการอ้างอิงแบบวงกลมดังนั้นจึงไม่มีทางที่จะไป มีวิธีใดบ้างรอบนี้เพื่อให้ฉันสามารถแยกสะอาดระหว่างสองชั้นนอกเหนือจากไม่ใช้ ASP.NET Identity?

2
ใน ASP.NET MVC โมเดลมุมมองควรมี ID หรือไม่?
เมื่อพัฒนาแอปพลิเคชัน ASP.NET MVC ที่อนุญาตให้อัปเดตโมเดลคุณต้องมีวิธีรู้วิธีนำโมเดลมุมมองที่อัปเดตและจับคู่กลับไปยังโมเดลที่ได้รับการอัปเดตในขณะนี้ ดูเหมือนจะมีวิธีการที่แตกต่างกันสองสามอย่างในการทำเช่นนี้และฉันสงสัยว่าสิ่งเหล่านี้ไม่เหมาะสมกับ MVC (เหมือนกับการมีตัวควบคุมที่เก็บข้อมูลของคุณซึ่งควรเป็นแบบจำลองไม่ใช่แบบ MVC ที่เหมาะสม) ทุกรุ่นที่ดูมีรหัส: ข้อดี ตรวจสอบให้แน่ใจเสมอว่าคุณสามารถจับคู่กับโมเดลของคุณได้ จุดด้อย คุณต้องระมัดระวังอย่างแท้จริงว่าไม่มีการเปลี่ยนแปลง ID ใด ๆ อีกคุณสามารถให้ผู้ใช้อัปเดตแถวที่ไม่ควรเข้าถึงได้ เฉพาะรุ่นมุมมองขั้นต่ำสุดเท่านั้นที่มี ID: ข้อดี จำเป็นต้องตรวจสอบน้อยกว่าเพื่อหลีกเลี่ยงผู้ใช้ที่อัปเดตข้อมูลที่ไม่ควรเข้าถึง จุดด้อย ยิ่งยากต่อการติดตามว่ามุมมองแบบใดตรงกับโมเดลใด คุณยังคงต้องตรวจสอบรุ่นที่มี ID บางรุ่นเพื่อให้แน่ใจว่าผู้ใช้ไม่ได้อัปเดตข้อมูลที่ไม่ควรเข้าถึง ไม่มีรุ่นที่มี ID: ข้อดี ไม่จำเป็นต้องตรวจสอบ ID เพื่อรับการปรับปรุง จุดด้อย คุณต้องละทิ้งการไร้สัญชาติ ดังนั้นฉันมีสองคำถาม ก่อนอื่นมีตัวเลือกที่ถูกต้อง / ไม่ถูกต้องหรือไม่? (ถ้าไม่นั่นหมายความว่าการเลือกเป็นเรื่องของความเห็นและความเห็นของคำถามที่สองเป็นไปตามและควรละเว้น) ประการที่สองหากมีตัวเลือกที่ถูกต้อง / ไม่ถูกต้องมันคืออะไร? เพื่อชี้แจงความคิดเห็นที่ฉันพูดคุยเมื่อคุณมีรูปแบบการดูที่เลียนแบบวัตถุฐานข้อมูลของคุณ คิดว่านี่: public class InvoiceViewModel //Does not …
11 mvc  asp.net-mvc 

1
MVC + 3 ชั้น ที่ ViewModels เข้ามาเล่น?
ฉันออกแบบแอพพลิเคชั่น 3 ชั้นโดยใช้ ASP.NET MVC 4 ฉันใช้ทรัพยากรต่อไปนี้เป็นข้อมูลอ้างอิง CodeProject: MVC + N-tier + Entity Framework แยกการเข้าถึงข้อมูลใน ASP.NET MVC ฉันมีดีไซน์ดังต่อไปนี้ Presentation Layer (PL) (โครงการ MVC หลักที่MของMVCถูกย้ายไปยัง Data Access Layer): MyProjectName.Main Views/ Controllers/ ... ชั้นตรรกะทางธุรกิจ (BLL) : MyProjectName.BLL ViewModels/ ProjectServices/ ... ชั้นการเข้าถึงข้อมูล (DAL) : MyProjectName.DAL Models/ Repositories.EF/ Repositories.Dapper/ ... ตอนนี้ PL อ้างอิง BLL …

4
โครงการโอเพ่นซอร์สจะประสบความสำเร็จได้อย่างไรหากไม่มีเอกสารเกี่ยวกับการออกแบบหรือสถาปัตยกรรม
ฉันต้องการพัฒนาทักษะการเขียนโปรแกรมของฉันโดยการศึกษาโครงการโอเพ่นซอร์สที่มีชื่อเสียง แต่ฉันคิดว่ามันง่ายที่จะหลงทางโดยเพียงแค่กระโดดลงไปในซอร์สโค้ดของพวกเขา ดังนั้นฉันจึงตัดสินใจที่จะอ่านเอกสารเกี่ยวกับการออกแบบหรือสถาปัตยกรรมของพวกเขา (เช่นแผนภาพ UML) เพื่อให้ได้แนวคิดทั่วไปเกี่ยวกับการจัดระเบียบโค้ดของพวกเขาก่อน ฉันประหลาดใจ แต่ฉันไม่สามารถหาเอกสารทางสถาปัตยกรรมสำหรับโครงการโอเพ่นซอร์สขนาดใหญ่เช่น Hibernate, Spring, ASP.NET MVC, Rails และอื่น ๆ ดังนั้นฉันจึงเริ่มสงสัยว่า: โครงการโอเพ่นซอร์สจะประสบความสำเร็จได้อย่างไรหากนักพัฒนาผู้มาใหม่ไม่มีเอกสารทางสถาปัตยกรรม / การออกแบบที่จะอ่านหรือถ้าผู้จัดการโครงการเพิ่งเปิดซอร์สโค้ด แต่ปิดเอกสาร?

4
ไปไกลแค่ไหนกับการทดสอบหน่วย
คำถามที่ถามมาหลายครั้งก่อน แต่มีการพัฒนาเอียง twds mvc เฉพาะ ฉันเป็นเด็กที่ดีมากและได้เขียนโค้ดแอ็คชั่นคอนโทรลเลอร์ทั้งหมดของฉันด้วยการทดสอบหน่วยที่เกี่ยวข้องซึ่งยอดเยี่ยมมาก (ถ้าซ้ำ ๆ [อ่านมาก ๆ ] ในบางครั้ง) ตามจริงแล้วฉันได้สร้างเทมเพลต T4 เล็ก ๆ น้อย ๆ เพื่อเขียนกระดูกเปลือยส่วนใหญ่ของการทดสอบหน่วยเริ่มต้นจากนั้นปรับแต่งตามความเหมาะสมตามการใช้งาน ฉันจะยอมรับว่าไม่แน่ใจว่าจะจัดการกับการทดสอบในมุมมองที่มีบางส่วนได้อย่างไร - แต่นั่นเป็นเรื่องราวสำหรับคำถามอื่น ตอนนี้ส่วนที่ยากสำหรับฉันที่จะตัดสินใจก็คือความครอบคลุมที่ลึกแค่ไหนในชั้นบริการของฉัน สาเหตุที่วิธีการบริการบางอย่างของฉัน (ดีขึ้นหรือแย่ลง) ดำเนินการกับคำสั่ง linq ที่หลากหลายซึ่งให้ข้อมูลที่รอบคอบกับตรรกะที่ตามมาภายในวิธีการนั้น ฉันรู้ว่าฉันสามารถ (ควร ??) ทำลายวิธีการเหล่านี้ลงไปเท่านั้นเรียกตรรกะที่จำเป็นสำหรับแต่ละคำสั่ง linq แล้วใช้พวกเขาภายในวิธีการ อย่างไรก็ตามในหลาย ๆ กรณีไม่มีการใช้งานซ้ำของฟังก์ชัน 'linq' และดังนั้นจึงรู้สึกว่าการทำเช่นนี้จะทำให้รหัสออกมาในระดับที่ไกลเกินไป สิ่งที่ฉันถามคือด้วยตรรกะที่ซับซ้อนที่เกิดขึ้นในวิธีการมันเป็น 'ดีพอ' ที่จะมีวิธีการทดสอบที่เพียงแค่อ้างถึงผลลัพธ์ที่ต้องการและ / หรือข้อผิดพลาดที่คาดหวังหรือควรจะทุกบรรทัดตรรกะพร้อมกันและทดสอบด้วย วิธีที่ฉันเห็นการทำการทดสอบอย่างถูกต้องจากนั้นเมธอดตรรกะ (ทีละบรรทัด) ควรได้รับความครอบคลุมบางประเภทเช่นกัน อย่างไรก็ตาม (ในความคิดเห็นที่ไร้เดียงสาของฉัน) อาจนำไปสู่วัฏจักรที่ไม่สิ้นสุดของการพยายามทดสอบและวิธีการที่นำมาใช้อย่างใกล้ชิด …
11 c#  .net  asp.net-mvc 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.